У меня есть 2 функции, используемые в многопоточной среде.
static std::vector<MyType> shared_resource;
void funcA(){
// remove/add object to shared_resource
}
void funcB(){
// Use shared_resource (but never changes it)
}
Я должен синхронизировать 2 функции, так что, хотя funcA работает на общем ресурсе, funcB ждет его. Одно очевидное решение - использовать критический раздел, но если я его использую, вызов функции funcB также сериализуется, и это то, чего я не хочу. Я имею в виду, что я хочу разрешить нескольким потокам выполнять funcB в одно и то же время, но как только funcA вызывается из другого потока, все потоки, входящие в funcB, блокируются, и после завершения потока выполнения funcB поток в funcA возобновляется и выполняется Это.
Я не знаю, ясно ли мое объяснение, поэтому я пишу пример. Предположим, что мы имеем поток T1-T5. И это ожидаемое поведение.
Что я должен использовать для достижения такого поведения? Семафор? Я реализую его в среде Windows/C++.