void method1() {
if (is_true) {
mutex1.lock();
condition_var.wait(mutex1,
[=] { return is_true == false; });
mutex1.unlock();
}
// do some work
}
void method2() {
if (is_true) {
mutex1.lock();
condition_var.wait(mutex1,
[=] { return is_true == false; });
mutex1.unlock();
}
// do some work
}
void method3() {
mutex2.lock();
is_true = true;
// do some job
mutex1.lock();
is_true = false;
condition_var.notify_all();
mutex1.unlock();
mutex2.unlock();
}
method1
和method2
可以同时执行,不需要进行任何自我同步,method3
可以与mutex2
同步。对于此method1
,method2
/ method3
无法与condition_var
同时运行,并且使用is_true
布尔值以及mutex1
。
我关注的是mutex1
创建了一个代码区域,其中method1
和method2
被阻止其并发行为。但我无法删除此互斥锁,因为is_true = false; condition_var.notify_all();
必须是原子操作。
如何重新设计它以从method1
和method2
移除锁定?
答案 0 :(得分:1)
您的代码没有问题。条件变量实际上没有状态。如果您在notify
之前致电wait
,它将无限期等待。因此,您必须手动实现状态is_true
并使用互斥锁来防止竞争条件。
您还可以使用事件对象(Windows的CreateEvent
,Linux的信号量),但效率会降低。 std::mutex
的实现使用快速自旋锁,并且仅在自旋锁超时后才进行慢速系统调用。代码的保护部分很短,因此锁定不会影响性能。