2012-01-11 17 views
3

グローバル変数が2つの異なるコア上で同時に実行される2つのスレッドで共有されている場合、共有リソースへのアクセスがあっても、変数はクリティカルセクションによって管理されますか?変数atomic(volatile)を宣言する必要がありますか?各コアは共有変数の値をキャッシュに持つことができ、あるスレッドがキャッシュ内のそのコピーに書き込むとき、別のコアの別のスレッドはスレッド1がロックを解除した後にそのキャッシュから古い値を読み取ることがあります。コンパイラは、デフォルトでクリティカルセクションまたはミューテックスによって管理される変数に対して、揮発性の読み込み/書き込み用のコードを生成しますか?同時実行性:マルチスレッド環境での共有変数のC++ 11メモリモデル

答えて

9

共有変数へのすべてのアクセスが同じミューテックスまたはクリティカルセクションによって保護されている場合、スレッドが異なるコア上にあっても、その変数のデータ競合および予期しない値は避けられます。ミューテックスのロックおよびロック解除機能には、キャッシュがプロセッサコア全体で正しく同期されることを保証するために必要な同期命令が含まれます。ロックされた領域内では、通常の命令を使用して共有変数にアクセスすることができます。

ミューテックスの保護なしでにアクセスしようとしない限り、共有変数をアトミックとして宣言する必要はありません。

+0

すばらしい説明をありがとう。コンパイラの最適化と新しいメモリモデルの話を読んだり、確認したかっただけです。もう一つの質問はクリティカルセクションを削除した後で、共有変数を原子として宣言すれば、正しい、有効な値を読み取ることだけです。アトミック宣言では、他のスレッドが古い(ただし有効な)値を読み取る可能性はまだありますか?または、コンパイラは、他のキャッシュから最新の値(揮発性読み取り値)を読み取るために強いメモリ順序を実行しますか? –

+0

@AbhijitKadam、それはまったく新しい質問です。アトミックを使用する関係での古い値と同期化は、mutexよりも少し複雑です。 –

+1

これは複雑な問題です。はい、無効な値を読み取る可能性がありますが、デフォルトでは、アトミックアクセスの合計順序は1つで、問題ありません。ところで、揮発性のアクセスはアトミック操作とは完全に独立しており、メモリの順序付けには影響しません。原子操作について知りたい場合は、新しい質問を投稿してください。 –

関連する問題