为什么在不使用时在此处声明 std::unique_lock
Why is std::unique_lock declared here when it isn't used
我目前正在研究条件变量,我开始明白了。但是,从这里开始的代码:
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
。
锁罩通常不会"使用"。 我们使用它们,以便我们可以锁定互斥锁,而不必担心在每个可能的退出路径中解锁互斥锁。 为了使生活变得简单,我们将解锁代码放入对象的析构函数中,该对象将在函数的任何退出路径上销毁,以便始终解锁互斥锁。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 为什么 std::unique 不调用 std::sort?
- 我对 std::unique(算法)C++有问题
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 为什么 [std::unique] 不能应用于 [std::multiset]?
- 使用 std::unique 和 vector.erase 删除除最后一次出现的重复元素之外的所有元素
- 是否可以在 std::unique<T[ ]> 上应用 std::sort?
- std::unique 是否有大小限制
- 从 std::unique 返回的迭代器的用法
- 使 std::unique<T> 与 std::unique<const T, CustomDeleterType 兼容>
- Std::list.unique()应该使迭代器无效
- 无法使用初始化器列表构造 vector<std::unique<...>>
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃
- 我能保证std::unique将保留第一个元素吗?
- 在 std::vector<std::unordered_set上使用 std::unique(<T>>