0

パブリッシャー スレッドとコンシューマー スレッドがあります。を介してデータを共有しますstd::stack<Data *>。パブリッシャーは単純にポインターを push() し、コンシューマーは単純にポインターを pop() し、それを使用して削除を呼び出します。一度に 1 つずつポインターを発行する単一のスレッドと、ポインターを消費する 1 つのスレッドしかないため、スタックを同期する必要はありますか? スタックはポインターのみを格納することに注意してください。パブリッシャーは、Data() が完全に構築されている場合にのみポインターをプッシュします。

4

3 に答える 3

3

名前空間const内のコンテナーのメソッド以外での同期の失敗は、未定義の動作です。std

の基になるコンテナーにpushpopありません。したがって、2 つのスレッドが両方とも、.conststackstack

それについて考える方法は、両方が、少なくとも、 の要素数のカウントをめぐって争わなければならないということ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 に答える