在示例代码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/

10-15 02:15