私は、状態(単純な列挙型)を持ち、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. MS OfficeはExcelシートを読み込んでSQL Serverテーブルに読み込む必要がありますか?
- 4. データを読み込んだ後でSocket.flush()が必要ですか?
- 5. アニメーションスクリプトの読み込みをサポートするJavascriptライブラリが必要
- 6. 読み取り/書き込みaxiトランザクションで必要なプロパティは何ですか?
- 7. UIWebView - どのような読み込み時間が必要ですか?
- 8. カスタムアクションフックが必要 - 記事の読み込み - ワードプレス
- 9. jQueryページの自動読み込みスクロールスクリプト - 説明が必要
- 10. Zend Framework:IIS7ヘルプの自動読み込みが必要
- 11. Composerが必要なクラスを自動読み込みしない
- 12. S3からパーケットファイルを読み込むにはハイブメタストアが必要ですか?
- 13. Googleライブラリから読み込むときにjsapiを読み込む必要はありますか?
- 14. AutoCAD C++ AcDbEntityを読み込み用に開く必要がある場合は、
- 15. 必要なページにのみJavascriptファイルを読み込む必要がありますか?
- 16. フラッシュに読み込むページでxmlの読み込みがありますか?
- 17. NodeJS:idiomaticが必要です:dirのファイルを読み込み、連結し、変換し、書き込みします。
- 18. Dockerの読み込みと読み込みの違いは何ですか?
- 19. MacOS Xでの.Frameworkの読み込みにはどのような手順が必要ですか?
- 20. なぜMyISAMにバックアップ中に読み込みロックが必要なのかInnodbでないのですか?
- 21. ページの読み込み中にモーダルを読み込む読み込み後に
- 22. ファイルからバイト[]を読み込み、読み込みます
- 23. JMeterのローカルプロパティファイルの読み込みにプラグインが必要なのはなぜですか?
- 24. なぜio :: copyは読み取りと書き込みの両方に可変参照が必要ですか?
- 25. リストビューの読み込み中にGIFが読み込まれる
- 26. JavascriptでJSONを読み込み/読み込みする 'id' = 'x'
- 27. asp.netでXMLファイルを読み込み、読み込みするMVC
- 28. 読み込みインクルードファイルがPHPスクリプトの読み込みを遅くしますか?
- 29. テキストファイルをHTML/JavaScriptに読み込み/読み込みする
- 30. 埋め込みドキュメントを読み込むためにPerl 6プログラムをコンパイルする必要はありますか?
ライタースレッドが(fetch-> write-> store)している間に、読者が前回または後のいずれかの未定義値をフェッチするときに、私は見ませんが、未定義ではありません。 –
1つの命令で読み込まれる列挙型の値を考慮に入れます。 –
@Arkaitz:undefinedはおそらく正しい言葉ではありませんでした。しかし、CPU /メモリー・アーキテクチャーは、キャッシュの追加レベル、遅延の増加などによりますます複雑になります。答えは簡単です。いいえ!データの共有をロックフリーにします。専門家でさえこの分野で多くの間違いを犯します。 – sellibitze