0

マルチスレッド環境で使用される関数が 2 つあります。

static std::vector<MyType> shared_resource;
void funcA(){
    // remove/add object to shared_resource
}

void funcB(){
    // Use shared_resource (but never changes it)
}

funcA が共有リソースで動作している間、funcB がそれを待機するように、2 つの関数を同期する必要があります。明らかな解決策の 1 つはクリティカル セクションを使用することですが、それを使用すると funcB への関数呼び出しもシリアル化され、それは私が望んでいないことです。つまり、複数のスレッドが funcB を同時に実行できるようにしたいのですが、別のスレッドから funcA が呼び出されると、funcB に入るすべてのスレッドがブロックされ、funcB を実行しているすべてのスレッドが終了した後、funcA のスレッドが再開されて実行されます。それ。

私の説明が明確かどうかわからないので、例を書きます。T1 から T5 までのスレッドがあるとします。そして、これは予想される動作です。

  1. T1 と T2 は funcB に入り、同時に funcB を実行します。
  2. T3 が funcA に入り、T1 と T2 が funcB から出るのを待ちます
  3. T4 は funcB に入りますが、T3 は funcA の実行を待機しているため、T4 は funcB の実行をブロックされます。
  4. T1 と T2 が終了した後、T3 が funcA を実行します。
  5. T5 は funcB に入りますが、funcA がまだ実行されているため、ブロックされます
  6. T3 が funcA を終了した後、T4 と T5 は funcB を同時に実行します。

この動作を実現するには何を使用すればよいですか? セマフォ?Windows/C++ 環境で実装しています。

4

1 に答える 1

4

いわゆるリーダー/ライター ロック、wikipediaを使用する必要があります。ここでpthreads を使用した簡単な実装を見つけることができます 。

于 2013-10-10T16:55:24.370 に答える