在使用者循环中重用unique_lock

Reusing a unique_lock in a consumer loop

本文关键字:unique lock 使用者 循环      更新时间:2023-10-16

我在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(( 来锁定关联的互斥锁。如果当前线程已拥有互斥锁,则未定义该行为,除非互斥锁是递归的。

因此,代码在每次迭代时都会锁定互斥锁。将其移出循环会改变逻辑。