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

最佳答案

您应该使用所谓的读取器-写入器锁wikipedia。您可以使用pthreads here找到一个简单的实现。

10-08 11:13