私は、状態(単純な列挙型)を持ち、2つのスレッドからアクセスされるクラスを持っています。状態を変更するために、私はmutex(boost :: mutex)を使用します。状態を確認するのは安全ですか(たとえばstate_ == ESTABLISHEDを比較)、この場合もmutexを使用する必要がありますか?言い換えれば、別のスレッドが同時に書き込むことができる変数を読みたいだけの場合は、ミューテックスが必要ですか?読み込みにはミューテックスが必要ですか?
答えて
はい。スレッドbがスレッドbに書き込んでいる間にスレッドaが変数を読み込むと、未定義の値を読み取ることができます。読み取りと書き込みの操作は、特にマルチプロセッサシステムでは不可分ではありません。
変数が "volatile"で宣言されている場合は、一般的に言えません。それが単一の変数である場合にのみ、そうでなければ可能なレースについて本当に注意する必要があります。
列挙型(読み取りまたは書き込み)へのアクセスを守る必要があります。
別のもの: スレッドの競合が少なく、スレッドが同じプロセスに属している場合、クリティカルセクションはミューテックスより優れています。
あなたは2つのスレッドを持っています。それらは情報を交換します。はい、ミューテックスが必要です。おそらくは条件付き待機も必要です。
あなたの例(compare state_ == ESTABLISHED)は、スレッド#2がスレッド#1が接続/状態を開始するのを待っていることを示しています。ミューテックスや条件文/イベントがなければ、スレッド#2はステータスを継続的にポーリングする必要があります。
スレッドは、パフォーマンスを向上させる(または応答性を向上させる)ために使用されます。通常、ポーリングは、多くのCPUを消費するか、またはポーリング間隔のために潜在性を導入することによってパフォーマンスを低下させます。
実際には、読み取りのためにオブジェクトへのアクセスをロックする理由はありません。あなたはそれを書いている間だけそれをロックしたい。これはまさにリーダライターのロックです。書き込み操作がない限り、オブジェクトをロックしません。パフォーマンスが向上し、デッドロックが防止されます。より精巧な説明については、以下のリンクを参照してください。それが依存
。
C++言語は、スレッドまたはアトミック性については何も言いません。
最新のCPUでは、整数を読み取ることはアトミックな操作です。つまり、ミューテックスなしでも常に一貫した値を読み取ることができます。ミューテックス、または同期の他のいくつかの形式ずに、コンパイラとCPUが並べ替えることは自由ですが
は、読み込みと書き込み、その複数の変数にアクセス関わるものより複雑な、何が、まだ一般的なケースでは安全ではありません。
ライタースレッドがいくつかのデータを更新し、データが使用可能であることを他のスレッドに知らせるために整数フラグを設定すると、これは並べ替えることができるため、に設定してからデータを更新します。ミューテックスまたは別の形式のメモリバリアを使用していない限り。
正しい動作をしたい場合は、そのようなミューテックスは必要ありません。読み込み中に他のスレッドが変数に書き込む場合は問題ありません。あなたが非常に珍しいCPUで作業しているのでなければ、原子的になるでしょう。しかし、あなたはを実行するは、コンパイラやCPUで並べ替えを防ぐために何らかの種類のメモリバリアが必要です。
- 1. マルチスレッドファイルの読み込み、シーク&リードにクリティカルセクションが必要ですか?
- 2. Hibernateは読み込みの開始とコミットが必要です
- 3. アニメーションスクリプトの読み込みをサポートするJavascriptライブラリが必要
- 4. データを読み込んだ後でSocket.flush()が必要ですか?
- 5. jQueryページの自動読み込みスクロールスクリプト - 説明が必要
- 6. カスタムアクションフックが必要 - 記事の読み込み - ワードプレス
- 7. Zend Framework:IIS7ヘルプの自動読み込みが必要
- 8. UIWebView - どのような読み込み時間が必要ですか?
- 9. Googleライブラリから読み込むときにjsapiを読み込む必要はありますか?
- 10. 必要なページにのみJavascriptファイルを読み込む必要がありますか?
- 11. フラッシュに読み込むページでxmlの読み込みがありますか?
- 12. Dockerの読み込みと読み込みの違いは何ですか?
- 13. MacOS Xでの.Frameworkの読み込みにはどのような手順が必要ですか?
- 14. なぜMyISAMにバックアップ中に読み込みロックが必要なのかInnodbでないのですか?
- 15. ファイルからバイト[]を読み込み、読み込みます
- 16. JavascriptでJSONを読み込み/読み込みする 'id' = 'x'
- 17. 読み込みインクルードファイルがPHPスクリプトの読み込みを遅くしますか?
- 18. 必要に応じて動的にCSSを読み込み/削除する
- 19. 書き込み前に読み込みがmallocedメモリで未定義ですか?
- 20. 文字列を変更するにはページに2つの読み込みが必要です
- 21. Webpackは必要なときだけブートストラップを読み込みます
- 22. 変数のみを読み込むにはグローバル変数を宣言する必要がありますか?
- 23. PowerPoint - ドキュメントの読み込み時にマクロを読み込みますか?
- 24. PyQt 4の読み込みでの読み込み
- 25. Perlループが読み込みファイルを読み込んでいませんか?
- 26. ページの読み込み時に毎回ページの読み込み
- 27. Webアプリケーションで遅延読み込みを気にする必要がありますか?
- 28. 名前空間の外部/内部に読み込みがある場合は読み込みますか?
- 29. ImageIOはいつInputStreamから読み込みを停止する必要がありますか?
- 30. PHPでcsvファイルを読み込んで読み込み
ライタースレッドが(fetch-> write-> store)している間に、読者が前回または後のいずれかの未定義値をフェッチするときに、私は見ませんが、未定義ではありません。 –
1つの命令で読み込まれる列挙型の値を考慮に入れます。 –
@Arkaitz:undefinedはおそらく正しい言葉ではありませんでした。しかし、CPU /メモリー・アーキテクチャーは、キャッシュの追加レベル、遅延の増加などによりますます複雑になります。答えは簡単です。いいえ!データの共有をロックフリーにします。専門家でさえこの分野で多くの間違いを犯します。 – sellibitze