在示例代码condition variable中,它显示:worker
线程拥有互斥锁之后(唯一锁定),然后等待。
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return ready;});
main
线程仍可以获取互斥锁(锁定防护)。{
std::lock_guard<std::mutex> lk(m);
ready = true;
}
这是否意味着lock_guard可以拥有由unique_lock拥有的互斥锁?
最佳答案
不,这意味着在wait
期间互斥锁被解锁,以允许提供程序线程锁定它并拥有对cv的权限。您省略了所引用的示例代码中最重要的行notify_one
:
{
std::lock_guard<std::mutex> lk(m);
ready = true;
std::cout << "main() signals data ready for processing\n";
}
cv.notify_one(); // wake up the waiting thread
这就是为什么需要将锁提供给
wait
,以便它可以在睡眠之前将其解锁,并在唤醒后尝试重新锁定。在页面的第一部分,您进行了链接,特别是注释2和3:
任何打算在std :: condition_variable上等待的线程都必须
在与用于保护共享变量的同一个互斥锁上获取std :: unique_lock
执行wait,wait_for或wait_until。等待操作以原子方式释放互斥锁并挂起线程的执行。
通知条件变量,超时到期或发生虚假唤醒时,将唤醒线程,并自动重新获取互斥量。然后,线程应检查条件,如果唤醒是虚假的,则应继续等待。
关于c++ - C++线程:lock_guard可以拥有由unique_lock拥有的互斥体吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36315967/