我在多线程环境中使用了 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。这是预期的行为。
- 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++ 环境中实现它。