グローバル変数が2つの異なるコア上で同時に実行される2つのスレッドで共有されている場合、共有リソースへのアクセスがあっても、変数はクリティカルセクションによって管理されますか?変数atomic(volatile)を宣言する必要がありますか?各コアは共有変数の値をキャッシュに持つことができ、あるスレッドがキャッシュ内のそのコピーに書き込むとき、別のコアの別のスレッドはスレッド1がロックを解除した後にそのキャッシュから古い値を読み取ることがあります。コンパイラは、デフォルトでクリティカルセクションまたはミューテックスによって管理される変数に対して、揮発性の読み込み/書き込み用のコードを生成しますか?同時実行性:マルチスレッド環境での共有変数のC++ 11メモリモデル
3
A
答えて
9
共有変数へのすべてのアクセスが同じミューテックスまたはクリティカルセクションによって保護されている場合、スレッドが異なるコア上にあっても、その変数のデータ競合および予期しない値は避けられます。ミューテックスのロックおよびロック解除機能には、キャッシュがプロセッサコア全体で正しく同期されることを保証するために必要な同期命令が含まれます。ロックされた領域内では、通常の命令を使用して共有変数にアクセスすることができます。
ミューテックスの保護なしでにアクセスしようとしない限り、共有変数をアトミックとして宣言する必要はありません。
関連する問題
- 1. マルチスレッド環境で共有メモリを同期
- 2. ドッカー共有環境変数
- 3. C#の同時実行の共有メモリ
- 4. Pythonのメモリモデル/実行環境の簡潔な解説?
- 5. 同時実行可能な変数の共有
- 6. マルチスレッド共有ローカル変数
- 7. Hololens共有環境のカスタムメッセージ
- 8. Scala/SBTテストスイート実行時の環境変数の設定
- 9. クラスタ環境でのバッチ・バッチ・ジョブの同時実行の回避
- 10. GCC/G ++:環境変数から-std = C++ 11を有効にする
- 11. 実行時に持続するantの環境変数
- 12. マルチスレッド環境のデストラクタ?
- 13. マルチスレッド環境のShiro
- 14. ドッカーで環境変数を共有するには
- 15. 共有環境設定コンテキストエラー
- 16. mod_perl共有環境でのデバッグ
- 17. 共有ホスティング環境でのCakePHPと.htaccess
- 18. C#の環境変数ファイル?
- 19. マルチスレッド環境でのHibernate.getCurrentSession()
- 20. マルチスレッド環境でのrocksdb
- 21. マルチスレッド環境でのLinq2SQLロックオブジェクト?
- 22. 共有マルチプラットフォームPOSIX環境でのCの使用
- 23. 同時環境のEhcache ReentrantReadWriteLock
- 24. 実行時に環境変数をkubernetesに渡す
- 25. 実行時にJenkins環境変数を設定する方法
- 26. C#データベースアプリケーションの同時実行性
- 27. シンプルなpythonマルチスレッド共有変数
- 28. テスト実行時の環境設定
- 29. マルチスレッドのない同時実行Async/Await
- 30. Pythonのvirtualenv環境を共有する
すばらしい説明をありがとう。コンパイラの最適化と新しいメモリモデルの話を読んだり、確認したかっただけです。もう一つの質問はクリティカルセクションを削除した後で、共有変数を原子として宣言すれば、正しい、有効な値を読み取ることだけです。アトミック宣言では、他のスレッドが古い(ただし有効な)値を読み取る可能性はまだありますか?または、コンパイラは、他のキャッシュから最新の値(揮発性読み取り値)を読み取るために強いメモリ順序を実行しますか? –
@AbhijitKadam、それはまったく新しい質問です。アトミックを使用する関係での古い値と同期化は、mutexよりも少し複雑です。 –
これは複雑な問題です。はい、無効な値を読み取る可能性がありますが、デフォルトでは、アトミックアクセスの合計順序は1つで、問題ありません。ところで、揮発性のアクセスはアトミック操作とは完全に独立しており、メモリの順序付けには影響しません。原子操作について知りたい場合は、新しい質問を投稿してください。 –