0

我在多线程环境中使用了 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。

我应该用什么来实现这种行为?信号?我在 Windows/C++ 环境中实现它。

4

1 回答 1

4

您应该使用所谓的读者-作者锁,维基百科您可以在此处找到使用 pthreads 的简单实现 。

于 2013-10-10T16:55:24.370 回答