为什么std :: unique_lock在不使用时声明在这里

new*_*erz 1 c++ condition-variable

我目前正在研究条件变量,我开始得到它.但是从这里的代码:

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

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

print_id我理解的声明,lck因为它将被使用cv.wait().在go函数中,我不明白目的声明,lck因为它没有被使用.我尝试删除并运行,看起来很好.是真的有必要还是我错过了什么?

Nat*_*ica 5

当你这样做

std::unique_lock<std::mutex> lck(mtx);
Run Code Online (Sandbox Code Playgroud)

您创建了一个名为对象lck调用lockmtx.你需要这个,因为它ready是一个非原子变量,并且在没有同步的情况下写入它是未定义的行为,因为你有另一个从它读取的线程.一旦go结束lck被销毁,它会自动呼唤unlock你.

锁定装置通常不会"使用".我们使用它们,以便我们可以锁定互斥锁,而无需担心在每个可能的退出路径中解锁互斥锁.为了简化生活,我们将解锁代码放入一个对象的析构函数中,该对象将在函数的任何退出路径上被销毁,以便互斥锁始终被解锁.