为什么 std::unique_lock 不用的时候在这里声明
Why is std::unique_lock declared here when it isn't used
我目前正在研究条件变量,我开始了解它。但是在 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
。
锁卫通常不是 "used"。我们使用它们以便我们可以锁定互斥锁,而不必担心在每个可能的退出路径中解锁互斥锁。为了让生活更轻松,我们将解锁代码放入一个对象的析构函数中,该对象将在函数的任何退出路径上被销毁,以便互斥锁始终被解锁。
我目前正在研究条件变量,我开始了解它。但是在 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
。
锁卫通常不是 "used"。我们使用它们以便我们可以锁定互斥锁,而不必担心在每个可能的退出路径中解锁互斥锁。为了让生活更轻松,我们将解锁代码放入一个对象的析构函数中,该对象将在函数的任何退出路径上被销毁,以便互斥锁始终被解锁。