std::thread
aが実行を終了したかどうかを確認したいと思います。stackoverflow を検索すると、この問題に対処する次の質問が見つかりました。受け入れられた答えは、終了する直前にワーカースレッドに変数を設定させ、メインスレッドにこの変数をチェックさせることを提案しています。このようなソリューションの最小限の実例を次に示します。
#include <unistd.h>
#include <thread>
void work( bool* signal_finished ) {
sleep( 5 );
*signal_finished = true;
}
int main()
{
bool thread_finished = false;
std::thread worker(work, &thread_finished);
while ( !thread_finished ) {
// do some own work until the thread has finished ...
}
worker.join();
}
受け入れられた回答についてコメントした人は、単純なbool
変数をシグナルとして使用することはできず、コードはメモリバリアなしで壊れており、使用std::atomic<bool>
は正しいと主張しています。私の最初の推測では、これは間違っていて単純bool
で十分ですが、何かが欠けていないことを確認したいと思います。上記のコードstd::atomic<bool>
を正しくするには、 が必要ですか?
メインスレッドとワーカーが異なるソケットの異なる CPU で実行されていると仮定しましょう。私が思うに、メイン スレッドthread_finished
は CPU のキャッシュから読み取ります。ワーカーがそれを更新すると、キャッシュ コヒーレンシ プロトコルがワーカーの変更をグローバル メモリに書き込み、メイン スレッドの CPU のキャッシュを無効にする処理を行うため、グローバル メモリから更新された値を読み取る必要があります。上記のようなコードを機能させるには、キャッシュの一貫性が重要なのではないでしょうか?