2017-01-11 41 views
0

條件變量的典型用法如下所示(請參閱下面的代碼):http://en.cppreference.com/w/cpp/thread/condition_variable如何確保在notify_one之前調用wait_for

但是,似乎主線程可能會在工作線程調用wait之前調用notify_one,這會導致死鎖。我錯了嗎?如果不是,那麼通常的解決方法是什麼?

#include <iostream> 
#include <string> 
#include <thread> 
#include <mutex> 
#include <condition_variable> 

std::mutex m; 
std::condition_variable cv; 
std::string data; 
bool ready = false; 
bool processed = false; 

void worker_thread() 
{ 
    // Wait until main() sends data 
    std::unique_lock<std::mutex> lk(m); 
    cv.wait(lk, []{return ready;}); 

    // after the wait, we own the lock. 
    std::cout << "Worker thread is processing data\n"; 
    data += " after processing"; 

    // Send data back to main() 
    processed = true; 
    std::cout << "Worker thread signals data processing completed\n"; 

    // Manual unlocking is done before notifying, to avoid waking up 
    // the waiting thread only to block again (see notify_one for details) 
    lk.unlock(); 
    cv.notify_one(); 
} 

int main() 
{ 
    std::thread worker(worker_thread); 

    data = "Example data"; 
    // send data to the worker thread 
    { 
     std::lock_guard<std::mutex> lk(m); 
     ready = true; 
     std::cout << "main() signals data ready for processing\n"; 
    } 
    cv.notify_one(); 

    // wait for the worker 
    { 
     std::unique_lock<std::mutex> lk(m); 
     cv.wait(lk, []{return processed;}); 
    } 
    std::cout << "Back in main(), data = " << data << '\n'; 

    worker.join(); 
} 
+0

data =「示例數據」; //將數據發送給工作線程 數據未被使用 – Peter

回答

1

注意使用條件(你應該永遠使用唯一的等待)的definition of wait

while (!pred()) { 
    wait(lock); 
} 

如果通知已經被解僱就意味着病情已經成爲事實(這是notify_one之前測序在信號線程中)。所以當接收者使用互斥鎖並查看pred()時,它將是真實的,它將繼續。

相關問題