1

共有キュー (シングルトン キュー ラッパーを使用して実装) と、リーダー スレッドとライター スレッドがあります。また、ライター スレッドがキューに要素を追加 (エンキュー) したときに、リーダー スレッドに通知するメカニズムもあります。リーダー スレッドは、通知されたときに 1 つの要素のみをデキューします。このシナリオでは、読み取り書き込みロックが必要ですか。

ライターはエンキューとリーダーのデキューのみであるため、デキュー時にリーダーがキューサイズをチェックする場合、ロックの必要はないように感じます。

4

2 に答える 2

2

ライターはエンキューとリーダーのデキューのみであるため、デキュー時にリーダーがキューサイズをチェックする場合、ロックの必要はないように感じます。

キューが別のスレッドによって変更された場合、操作だけではすでに安全ではないという問題があります。C++ では、非アトミック共有変数 (少なくとも 1 つが書き込み) への非同期アクセスはデータ競合であり、したがって UB です。

于 2015-07-18T08:38:55.703 に答える
1

stl::queue を意味すると思いますが、 stl コンテナーほとんどの操作はスレッド保存ではありません。例外の説明については、C++11 STL コンテナーとスレッド セーフを参照してください。STL は、開発者が独自のチェックを実装することを前提として、セキュリティ (配列インデックスの範囲チェックなど) よりも速度を優先します。

于 2015-07-18T08:08:20.050 に答える