我有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 ++环境中实现它。
最佳答案