簡體   English   中英

在消費者循環中重用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變量不能在循環開始之前初始化嗎?

正如cppreference所述, std::unique_lock構造函數是這樣的:

explicit unique_lock( mutex_type& m );

構造函數將執行以下操作:

構造一個unique_lock,其中m作為關聯的互斥鎖。 另外通過調用m.lock()來鎖定關聯的互斥鎖 如果當前線程已經擁有互斥鎖,則該行為是未定義的,除非互斥鎖是遞歸的。

因此代碼會在每次迭代時鎖定互斥鎖。 將它移出循環會改變邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM