2个函数中的不同条件锁

时间:2013-10-10 16:42:44

标签: c++ windows multithreading

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

  1. T1和T2进入funcB并同时执行funcB。
  2. T3正在进入funcA并等待T1和T2退出funcB
  3. T4正在进入funcB,但由于T3正在等待执行funcA,T4被阻止执行funcB
  4. T1和T2退出T3后执行funcA
  5. T5正在进入funcB,但由于funcA仍然被执行,因此被阻止
  6. T3退出funcA后,T4和T5同时执行funcB。
  7. 我应该用什么来实现这种行为?信号?我正在Windows / C ++环境中实现它。

1 个答案:

答案 0 :(得分:4)

你应该使用所谓的读者 - 作者锁,wikipedia。您可以使用pthread here找到一个简单的实现。