簡體   English   中英

提高條件變量的使用

[英]Boost condition variable usage

我正在嘗試實現生產者-消費者模式。 我做了作業,但仍不確定。 實現如下:

boost::mutex m_mutex;
boost::container::deque<T> m_buffer;
boost::condition_variable fifo_loaded;

T pop(void)
{
    boost::mutex::scoped_lock lock(m_mutex);

    while (m_buffer.empty())
    {  
        fifo_loaded.wait(lock); // As i understand, it releases the mutex, 
                                   and whenever it is notified, 
                                   gets it back again   
    }       
    T tmp = m_buffer.front();       
    m_buffer.pop_front();       
    return tmp; 
}


void push(const T &newElem) 
{       
    boost::mutex::scoped_lock lock(m_mutex);        
    m_buffer.push_back(newElem);        
    lock.unlock();      
    fifo_loaded.notify_one();   
}

生產者-消費者對如下所示。 可以,還是在這里也需要同步?

void produce_thread()
{
    while(true)
    {
        double data = generate_data();  
        m_buffer.push(data);
    }   
}

void consume_thread()
{
    while (true)
    {
        double data = m_buffer.pop();
        process_data(data);
    }
}

void start_system()
{
    boost::thread* thread_a = new boost::thread(capture_thread);
    boost::thread* thread_b = new boost::thread(process_thread);
}

我如何手動停止線程? 用下面的布爾值管理它可以嗎?

bool enabled;

void produce_thread()
{
    while(enabled)
    {
        // Do stuff
    }   
}

void consume_thread()
{
    while (enabled)
    {
        // Do stuff
    }
}

您的示例實際上並未使用您編寫的線程安全的push和pop函數,而是直接調用了雙端隊列的push和pop函數。 如果確實使用了那些,那么它將是線程安全的,並且producer_thread / consumer_thread將不需要額外的同步

話雖如此,yohjp是正確的。 您不能只擁有不受保護的布爾值(如“啟用”)。 C ++ 11規范將數據速率定義為一個線程能夠寫入值而另一個線程能夠讀取或寫入值的任何時間。 此定義與C ++ 11之前的編譯器使用的定義匹配(只是使它成為正式的)。

enabled必須是一個原子布爾值,例如boost :: atomic,或者您需要一個附加的互斥量來保護“ enabled”,其規則是除非您持有該互斥量,否則您不能讀寫enable。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM