c++ - 为什么std::unique_lock在不使用的时候在这里声明

标签 c++ condition-variable

我目前正在研究条件变量,并且我开始了解它。但是关于 here 的代码:

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();
}

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

最佳答案

当你做的时候

std::unique_lock<std::mutex> lck(mtx);

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

通常不会“使用”锁防护装置。我们使用它们以便我们可以锁定互斥锁,而不必担心在每个可能的退出路径中解锁互斥锁。为了让生活更轻松,我们将解锁代码放入一个对象的析构函数中,该对象将在函数的任何退出路径上被销毁,以便互斥锁始终被解锁。

关于c++ - 为什么std::unique_lock在不使用的时候在这里声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45884773/

相关文章:

c++ - std::condition_variable wait_for 无限

c++ - condition_variable 等待参数?

c++ - 条件变量中 wait_for 函数的用途 - C++11

c++ - 在类中抛出异常的最佳方式是什么?

c++ - 我应该坚持使用哪种语言

c++ - 为什么不只有一个?复制构造函数和赋值运算符

c++ - 把最胖的人从重载的飞机上扔下来。

c++ - boost 线程同步

ruby - 共享互斥体的交替例程

c++ - 如何在生产者-消费者场景中使用 Boost 条件变量?