我们有两个函数: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/