the*_*sys 7 c++ multithreading condition-variable c++11
我在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
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个生产者线程,它推Message
送到队列并在循环中通知等待的线程.
我的问题是:是否需要unique_lock
在循环的每次迭代中创建一个新的?这对我来说似乎是不必要的,因为在下一行中,mcond.wait(lck)
锁在锁定之前直接解锁.
从性能的角度来看,lck
变量只能在循环开始之前初始化?
正如cppreference所述,std::unique_lock
构造函数是这样的:
explicit unique_lock( mutex_type& m );
Run Code Online (Sandbox Code Playgroud)
构造函数将执行以下操作:
构造一个unique_lock,其中m作为关联的互斥锁.另外通过调用m.lock()来锁定关联的互斥锁.如果当前线程已经拥有互斥锁,则该行为是未定义的,除非互斥锁是递归的.
因此代码会在每次迭代时锁定互斥锁.将它移出循环会改变逻辑.
归档时间: |
|
查看次数: |
906 次 |
最近记录: |