パブリッシャー スレッドとコンシューマー スレッドがあります。を介してデータを共有しますstd::stack<Data *>
。パブリッシャーは単純にポインターを push() し、コンシューマーは単純にポインターを pop() し、それを使用して削除を呼び出します。一度に 1 つずつポインターを発行する単一のスレッドと、ポインターを消費する 1 つのスレッドしかないため、スタックを同期する必要はありますか? スタックはポインターのみを格納することに注意してください。パブリッシャーは、Data() が完全に構築されている場合にのみポインターをプッシュします。
3 に答える
3
名前空間const
内のコンテナーのメソッド以外での同期の失敗は、未定義の動作です。std
の基になるコンテナーにpush
もpop
ありません。したがって、2 つのスレッドが両方とも、.const
stack
stack
それについて考える方法は、両方が、少なくとも、 の要素数のカウントをめぐって争わなければならないということstack
です: 一方はそれを増やそうとしており、もう一方は減らそうとしています。(他にも問題はありますが、どちらも の状態に書き込んでいることがわかるはずですstack
)
于 2013-01-31T15:32:31.477 に答える
1
複数のスレッドが ( および を介して)std::stack<Data*>
インスタンスを変更できるため、インスタンスへのアクセスを同期する必要がありますが、一度に 1 つのスレッドしか要素を操作できないため、インスタンスに含まれる要素はそうではありません。pop()
push()
于 2013-01-31T15:26:38.290 に答える
1
はい、スタックへのアクセスを同期する必要があります。std::stack
クラスは、操作がアトミックであることを保証しておらず、可能であり、インターリーブpush()
するためです。top()
pop()
于 2013-01-31T15:26:43.377 に答える