我目前正在学习条件变量,我开始明白了。但是从here代码:为什么在不使用std :: unique_lock的时候这里声明了
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
我理解,因为它会被cv.wait()
使用的lck
声明。在go
函数中,我不明白lck
的用途声明,因为它没有被使用。我试图删除和运行,似乎很好。是真的有必要还是我错过了什么?
http://en.cppreference.com/w/cpp/thread/condition_variable也许这更清晰。 “lck不被使用” - 但只是构造它有一个非常重要的副作用:它锁定mtx。 – Mat
感谢您的评论。我需要重新检查我的学习材料。如果我记得,lock_guard会自动锁定mtx。但是在unique_lock上,需要手动调用锁定方法来锁定mtx。即使在http://en.cppreference.com/w/cpp/thread/unique_lock/unique_lock上,它也表示它并未锁定构建中的互斥锁。 –
@newbieprogrammerz看看你正在使用的过载3,它会锁定互斥锁。 – NathanOliver