次のコードを参照してください。この単純なシナリオでデッドロックは可能ですか?
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):
Aは次のようになります(最小限の変更で)コードを修正しました – melak47
@ melak47詳細を記入してください。私はこれが 'std :: memory_order'であることを知っています。しかし、私はどのように 'std :: condition_variable'がメモリの順序制限で動作するのか分かりません。 –
関連:http://stackoverflow.com/questions/8819095/concurrency-atomic-and-volatile-in-c11-memory-model – Leon