在使用者循环中重用unique_lock
Reusing a unique_lock in a consumer loop
我在Bjarne Stroustrup的"The C++ Programming Language, 4th Edition"第119页偶然发现了以下代码:
queue<Message> mqueue;
condition_variable mcond;
mutex mmutex;
void consumer()
{
while(true) {
unique_lock<mutex> lck{mmutex};
mcond.wait(lck);
auto m = mqueue.front();
mqueue.pop();
lck.unlock();
// process m
}
}
还有一个生产者线程,它将Message
推送到队列,并在循环中通知等待线程。
我的问题是:是否需要在循环的每次迭代中创建新unique_lock
?这对我来说似乎没有必要,因为在下一行中,mcond.wait(lck)
,锁在之前的行中锁定后直接解锁。
从性能的角度来看,lck
变量不能在循环开始之前初始化吗?
如 cpp首选项中所述,std::unique_lock
构造函数如下:
explicit unique_lock( mutex_type& m );
构造函数将执行以下操作:
构造一个将 m 作为关联互斥锁的unique_lock。此外,通过调用 m.lock(( 来锁定关联的互斥锁。如果当前线程已拥有互斥锁,则未定义该行为,除非互斥锁是递归的。
因此,代码在每次迭代时都会锁定互斥锁。将其移出循环会改变逻辑。
相关文章:
- 为什么 std::unique 不调用 std::sort?
- 尝试构建"lock-free"数据结构C++
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 生成"unique"矩阵
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- 我对 std::unique(算法)C++有问题
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- "lock cmpxchg"如何在装配中工作?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- std::lock 仍然导致死锁
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 使用Mutex,lock_guard,在课堂中正确地lock
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- C++ 如何生成 10,000 个 UNIQUE 随机整数以存储在 BST 中?