为什么在不使用时在此处声明 std::unique_lock

Why is std::unique_lock declared here when it isn't used

本文关键字:unique std lock 声明 为什么      更新时间:2023-10-16

我目前正在研究条件变量,我开始明白了。但是,从这里开始的代码:

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

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