考虑一下:
// Somewhere
std::mutex mutex;
std::unique_lock lock{mutex};
std::condition_variable condition;
// Thread01
condition.wait(lock);
// Thread02
while (lock.owns_lock());
所以我得到了这样的情况,Thread02
的循环永远不会结束,不管Thread01
正在等待条件。
这意味着在std::condition_variable::wait
处解锁锁与在std::unique_lock::owns_lock
处检查锁是否被锁定不同步。这里明确地告知CCD_ 5";原子解锁">,但这里没有告诉owns_lock
是原子的或与锁操作同步。
所以问题是:我如何原子地检查wait
是否原子地解锁了锁?
编辑:
希望在Thread02
处知道Thread01
是否在等待该条件。这就是为什么我接受了这个答案。
您可以立即锁定并获得所需的Thread02:
// Thread02
std::unique_lock{mutex};
// mutex isn’t locked