最も一般的なプラットフォーム(最も重要なのはx86です。一部のプラットフォームには、マルチスレッドに役立つ保証がほとんどない非常に難しいメモリモデルがあることを理解していますが、まれな反例は気にしません)、次のコードは安全ですか?
スレッド1:
someVariable = doStuff();
atomicSet(stuffDoneFlag, 1);
スレッド2:
while(!atomicRead(stuffDoneFlag)) {} // Wait for stuffDoneFlag to be set.
doMoreStuff(someVariable);
アトミック操作の標準的で合理的な実装を想定すると、次のようになります。
- スレッド1の割り当ては、呼び出される
someVariable
前に完了することが保証されていますか?atomicSet()
- スレッド2は、アトミックに読み取る場合、
someVariable
呼び出す前に割り当てを確認することが保証されていますか?doMoreStuff()
stuffDoneFlag
編集:
- 私が使用しているアトミック操作の実装には
LOCK
、役立つ場合は、各操作にx86命令が含まれています。 stuffDoneFlag
なんとかして適切にクリアされたと仮定します。どのように重要ではありません。- これは非常に単純化された例です。問題のコンテキスト全体を理解して答える必要がないように、この方法で作成しました。私はそれが効率的ではないことを知っています。