6

次の状況を考慮してください。

複数のスレッドで使用されるオブジェクト foo があり、foo でメソッド bar() を繰り返し呼び出す場合としない場合があります。

foo の状態を決して変更しないため、bar() が複数回並行して実行されることはまったく問題ありません (そして望ましいことです)。

問題は、外部から foo の状態を変更する必要がある場合に発生します (「ワーカー」スレッドの 1 つからではなく、別のスレッドから) - 最後のワーカー スレッドまで呼び出しスレッドがブロックされるように foo をロックするにはどうすればよいですか? bar() で完了し、foo を再び解放するまで、すべてのワーカー スレッドが bar() でブロックされますか?

明らかに、bar() の実行中にロックされたままのミューテックスを使用することはできません。

何か案は?または、これらのタイプの問題に対するより良い設計はありますか?

4

1 に答える 1

4

foo を使用してライターに更新させるワーカーがいないことをどのように達成するかはわかりませんが、それが問題ではない場合は、読み取り/書き込みミューテックスを使用してください(ワーカーは読み取りロックを取得し、ライターは取得します書き込みロック)。

ただし、foo をコピー オン ライトにすることを検討することをお勧めします。このようにして、同期のオーバーヘッドをゼロに近づけます。これを実現するために、 shared_ptr をアトミックに使用できます。

于 2013-01-09T11:44:23.260 に答える