マルチスレッド環境で使用される関数が 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 までのスレッドがあるとします。そして、これは予想される動作です。
- T1 と T2 は funcB に入り、同時に funcB を実行します。
- T3 が funcA に入り、T1 と T2 が funcB から出るのを待ちます
- T4 は funcB に入りますが、T3 は funcA の実行を待機しているため、T4 は funcB の実行をブロックされます。
- T1 と T2 が終了した後、T3 が funcA を実行します。
- T5 は funcB に入りますが、funcA がまだ実行されているため、ブロックされます
- T3 が funcA を終了した後、T4 と T5 は funcB を同時に実行します。
この動作を実現するには何を使用すればよいですか? セマフォ?Windows/C++ 環境で実装しています。