[英]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
變量不能在循環開始之前初始化嗎?
正如cppreference所述, std::unique_lock
構造函數是這樣的:
explicit unique_lock( mutex_type& m );
構造函數將執行以下操作:
構造一個unique_lock,其中m作為關聯的互斥鎖。 另外通過調用m.lock()來鎖定關聯的互斥鎖 。 如果當前線程已經擁有互斥鎖,則該行為是未定義的,除非互斥鎖是遞歸的。
因此代碼會在每次迭代時鎖定互斥鎖。 將它移出循環會改變邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.