4

私はC++を使用しており、Boostライブラリのmutex、recursive_mutex、およびその他の同期オブジェクトを使用しています。

私はしばしば次のパターンを持っています:

  • void RebuildAll()。この関数は多くの内部変更を行います。
  • DoSomethingA()を無効にします。RebuildAllが構築したものを使用していくつかの作業を行います。
  • void DoSomethingB()。RebuildAllが構築したものを使用していくつかの作業を行います。
  • DoSomethingC()を無効にします。RebuildAllが構築したものを使用していくつかの作業を行います。
  • ..。

関数は、さまざまなスレッドから呼び出すことができます。DoSomethingA()、DoSomethingB()、DoSomethingC()を並行して実行できるようにしたい。ただし、RebuildAll()を呼び出すときは、DoSomething関数が実行されていないことを確認する必要があります。

これらの機能を保護するのに役立つものはありますか?

4

1 に答える 1

4

これは、リーダーライターロックと呼ばれることがよくあります。リーダーライターロックのルールは次のとおりです。

  • おそらく異なるスレッドによって、任意の数の読み取りロックをいつでも取得できます。
  • すべてのリーダーが完了した場合にのみ、1人のライターだけがロックを取得できます。
  • ライターがロックを所有している間は、リーダーはロックを取得できません。

あなたの例でRebuildAll()は、はライターであり、DoSomethingA()スルーDoSomethingC()はリーダーです。

Boostには、と呼ばれるリーダーライターロックの実装がありますboost::shared_mutex。ただし、これはまだ標準ライブラリにはありません。

于 2012-12-19T22:22:22.700 に答える