为什么std :: condition_variable的notify和wait函数都需要一个锁定的互斥锁

lau*_*svr 5 c++ multithreading mutex locking c++11

在我无休止地了解std::contion_variables的过程中,我遇到了以下问题.在此页面上显示以下内容:

void print_id (int id) {
  std::unique_lock<std::mutex> lck(mtx);
  while (!ready) cv.wait(lck);
  // ...
  std::cout << "thread " << id << '\n';
}
Run Code Online (Sandbox Code Playgroud)

之后它说:

void go() {
  std::unique_lock<std::mutex> lck(mtx);
  ready = true;
  cv.notify_all();
}
Run Code Online (Sandbox Code Playgroud)

据我了解,这两个功能都将停止std::unqique_lock.直到获得一个独特的锁.也就是说,没有其他线程有锁.

所以说print_id首先执行该功能.将获取唯一锁定,并且该功能将在等待线上停止.

如果go然后执行该函数(在单独的线程上),则该代码将在唯一的锁定行上停止.由于互斥锁已被该print_id功能锁定.

显然,如果代码是这样的话,这将无效.但我真的没有看到我没有到达这里.所以请赐教.

mol*_*ilo 9

你缺少的是wait解锁互斥锁然后等待信号开启cv.

它在返回之前再次锁定互斥锁.

您可以通过单击找到示例的页面上的wait来找到它:

在阻塞线程的那一刻,该函数自动调用lck.unlock(),允许其他锁定的线程继续.

一旦被通知(显式地,由其他一些线程),该函数解除阻塞并调用lck.lock(),使lck处于与调用函数时相同的状态.