c++ - 如何使用 C++11 线程功能同步 2 个函数?

标签 c++ multithreading c++11

我们有两个函数:a() 和 b()。

有多个线程。其中一些想要执行a(),另一些想要执行b()。有以下限制:

  • 不允许2个线程同时执行a()
  • 当某个线程正在执行a()时,不允许任何线程执行b()
  • 允许多个线程同时执行b()

如何使用 C++11 功能对其进行编码?

最佳答案

pointed out in the comments ,这是读写锁的典型用例,如 C++14 的 std::shared_timed_mutex 所指定。 .

因此,如果您的标准库实现已经支持它,只需使用该标准库实现即可:

std::shared_timed_mutex mtx;

void a() {
    std::unique_lock<std::shared_timed_mutex> lk(mtx);
    // ...
}

void b() {
    std::shared_lock<std::shared_timed_mutex> lk(mtx);
    // ...
}

最近版本的 Boost.Thread 提供了与编译器无关的实现.

如果您不能使用其中任何一个,您仍然可以尝试推出自己的实现(尽管这具有通常的缺点,如果您不小心,可能会引入微妙的错误)。

基本思想是有一个由普通互斥锁保护的计数器。每当获取共享锁时,计数器就会增加;每当共享锁被释放时,计数器就会减少。获取独占锁会将计数器设置为一个特殊值,否则无法访问该值。

仅当计数器为 0 时才允许获取独占锁(即当前没有事件的共享锁)。仅当计数器不处于特殊值时才允许获取共享锁(即当前没有持有独占锁)。如果您尝试获取锁并且不满足相应的前提条件,则您可以旋转或(可能更可取)等待条件变量,直到满足前提条件。请注意,在这种情况下,您将需要两个条件变量,每个前提条件一个。

关于c++ - 如何使用 C++11 线程功能同步 2 个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25843336/

相关文章:

c++ - std::initializer_list 作为 std::array 构造函数

c++ - 具有右值引用参数的模板赋值运算符在 vs2013 和 gcc 中的行为有所不同

c++ - 在 C++ 中读取不同格式的数据

c++ - 误报警告 PVS Studio : V808 object of type was created but was not utilized

java - 线程安全队列类出现问题。具体来说,除了异常(exception)情况

c++ - 可变模板函数情况下的模板特化

c++ - atomic_int 和 int 有什么区别?

c++ - 当类是另一个模板的模板参数时,可以使用类模板参数推导吗?

python - 实例变量的线程问题

java - != 检查线程安全吗?