請參見下面的代碼:在這種簡單的情況下可能發生死鎖嗎?
std::mutex mutex;
std::condition_variable cv;
std::atomic<bool> terminate;
// Worker thread routine
void work() {
while(!terminate) {
{
std::unique_lock<std::mutex> lg{ mutex };
cv.wait(lg);
// Do something
}
// Do something
}
}
// This function is called from the main thread
void terminate_worker() {
terminate = true;
cv.notify_all();
worker_thread.join();
}
在以下情況下會發生?
- 工作線程正在等待信號。
- 主線程叫做
terminate_worker()
;- 主線程將原子變量
terminate
設置爲true
,然後通知工作線程。 - 工作線程現在醒來,完成工作並從
terminate
加載。在這一步,改爲terminate
所做的主線程還沒有看到,所以工作線程決定等待另一個信號。
- 主線程將原子變量
- 現在發生死鎖...
我不知道這是以往任何時候都可能。據我瞭解,std::atomic
只保證沒有競爭條件,但記憶順序是不同的事情。問題:
- 這可能嗎?
- 如果這是不可能的,如果
terminate
不是一個原子變量,但這只是bool
?或者原子性與此無關? - 如果這是可能的,我該怎麼辦?
謝謝。
['的std :: memory_order'](http://en.cppreference.com/w/cpp/atomic/memory_order) – melak47
@ melak47請提供更多細節。我知道這是關於'std :: memory_order'。但我不知道'std :: condition_variable'如何處理內存順序限制。 –
相關:http://stackoverflow.com/questions/8819095/concurrency-atomic-and-volatile-in-c11-memory-model – Leon