0

データセットが特定のスレッドによって書き込まれているかどうかを判断するC++の変数でInterlockCompareExchange操作を使用するある種のアルゴリズムを使用する場合(独自の小さなロックを作成することによって)、インターロックされた操作を確実にするにはどうすればよいですか?値を更新したものは、データがi7のレベル2キャッシュなどに格納されている場合、他のスレッドによってすぐに認識されます。

マルチコアプロセッサのキャッシュ間でデータの一貫性を保つためにキャッシュコヒーレンシが使用されていることは知っていますが、あるコアがインターロック機能を使用して変数を更新し、キャッシュがコヒーレンシの問題をチェックして修正するときの短い時間枠についてはどうでしょうか独自のキャッシュにある変数をチェックしていますか?InterlockCompareExchange操作を行っている変数が揮発性であり、変更がメモリに直接書き込まれるようにした場合、この問題は修正されますか?メモリバリア(VSのMemoryBarrier())はキャッシュの一貫性を保証せず、不要な命令の並べ替えのみを保証すると信じるのは正しいですか?

私の質問が曖昧すぎないことを願っています。もしそうなら、コメントに答えようとします。特定の問題がないため、この質問で投稿するソースコードはありませんが、特にc ++ 0xにインターロックが含まれている場合に、問題が発生する可能性があるかどうかを後で参照できるようにしたいと思います。その標準ライブラリの。

ありがとうございました。

4

1 に答える 1

1

コンパイラーは、インターロックされた関数呼び出し全体でロードまたはストアを並べ替えることができません。実装には、CPUコアがそうでないことを確認するために必要なマシン命令が含まれます。

キャッシュの一貫性は常に維持されます。心配する必要があるのは、値が実際に命令パイプラインからキャッシュに書き出されるときだけです。これは順序の問題です。

于 2011-07-01T02:33:49.343 に答える