我在Bjarne Stroustrup的《C++程序设计语言(第四版)》第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
变量是否可以在循环开始之前初始化?
wait
函数期望锁被锁定!如果它没有被锁定,那么你就会有未定义的行为。因此,放置锁不仅仅是关于“接近”,而是为了避免问题。 - Some programmer dude