他のスレッドが終了するためのフラグを設定する必要があります。他のスレッドは時折出口フラグをチェックします。私は旗のために原子を使わなければならないのか、それとも普通のブールだけで十分ですか?"exit" bool変数にアトム<bool>を使用する必要がありますか?
#include <future>
bool exit = false;
void thread_fn()
{
while(!exit)
{
//do stuff
if(exit) break;
//do stuff
}
}
int main()
{
auto f = std::async(std::launch::async, thread_fn);
//do stuff
exit = true;
f.get();
}
実際には「ブール」へのアクセスはどのようにアトミックなものになるのかほとんどわかりません(私は正式な標準では同意しますが、それは他のすべての問題です)。とにかく、競合状態とは別に、私は、コンパイラがデータをキャッシュしたり、命令を並べ替えることを保証するためのメモリバリア( 'atomic <>'または 'std :: mutex'によって提供される)も必要と考えています。しかし、私はそれを正しく説明するための理論的知識が欠けています(実際にそれを使用する方法はわかっていますが)できる場合は私に教えてください。それとも新しい質問を作成すべきですか? – syam
標準的なデータ競合状態は、(狭く)精緻化するために、あるスレッドが他のスレッドが見ることができるものだけではありません。また、最適化やコードの並べ替えについても説明します。コンパイラはデータレースを想定できないため、あるスレッドが変数を読み込み、それを変更しないと、同期ポイント間で値を変更することはできません。スレッドは決して終了しません。スレッドがフラグを使用せずにフラグを設定した場合、変更は他のコードの前に来るように並べ替えられます(最後の同期ポイントの後)。私はキャッシュの一貫性を無視しています。これがアトミックが存在する理由です。 –
@Andyポイントまで正確に引用 - 私が原子を使用するのに十分なほど。うまくいけば、彼の答えでピートは、プレーンなブールを使用することで発生する可能性が私の例のコードで実際の問題の説明を明確にします。 –
PowerGamer