【发布时间】:2016-12-23 17:56:11
【问题描述】:
我有一个std::condition_variable_any,它等待一个自定义锁,该锁由两个互斥锁(一个std::mutex 和一个共享锁定std::shared_mutex)组成。它的unlock() 操作只是按顺序解锁两个互斥锁。
例如(伪代码):
mutex mutex1;
shared_mutex mutex2;
condition_variable_any cv;
// acquiring the locks
DualLock lock(unique_lock(mutex1), shared_lock(mutex2));
// waiting
cv.wait(lock);
cv.wait() 应该原子地解锁mutex1 和mutex2,并让线程休眠直到cv 得到通知。
一旦mutex1 或mutex2 中的任何一个被解锁,它仍然保证线程正在睡眠并监听条件变量通知?
或者是否有可能一个互斥锁被解锁,第二个线程锁定它,发送通知,但第一个线程还没有休眠和监听。所以通知永远不会到达,也不会发生唤醒。
【问题讨论】:
-
如果
DualLock不使用std::lock来锁定互斥锁,你就有死锁的危险。您的伪代码看起来在构造DualLock的行中面临死锁的危险。
标签: c++ multithreading c++11 mutex condition-variable