【发布时间】:2018-08-10 07:06:46
【问题描述】:
std::condition_variable 使用如下:
std::condition_variable cv;
...
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return processed;});
在我看来有一个有趣的问题。 unique_lock 可以推迟,它可以被交换掉。通过代码设计,它可能有许多其他原因,不一定是它实际上没有被锁定的严重错误。例如。
std::unique_lock<std::mutex> lk(m, std::try_to_lock_t); // or std::defer_lock_t
// Try to lock fails.
cv.wait(lk, []{return processed;});
为什么不通过使std::conditional_variable 与lock_guard 一起工作来强制锁定情况呢?那么你将很难进入这种情况。事实上,唯一的方法就是这样做:
// m is not already locked
std::lock_gaurd<std::mutex> lk(m, std::adopt_lock);
cv.wait(lk, []{return processed;});
而不是unique_lock 提供的多种方式。 在condition_variable 上使用unique_lock 而不是lock_guard 是否有技术原因?
【问题讨论】:
-
问题标题正是这里提出的问题。接受的答案涵盖了所有基础(甚至比这里的当前答案还要多)。 OP 确实做到了
mutex与unique_lock,但投票率最高的答案涵盖了更多内容,包括关于为什么不lock_guard的专门段落。 -
@rubenvb 你是绝对正确的。当我阅读答案时,我一定错过了那段。感谢您的帮助。
-
没问题。重复项主要用于引导用户和访问者获得良好的综合答案。这不是手腕上的一记耳光或任何东西。只是一个303 See other。
标签: c++ multithreading thread-safety