簡體   English   中英

在scoped_lock上解鎖的無關緊要

[英]Extraneous call to unlock on scoped_lock

在以下博文中:

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

有一個'推送'方法定義如下:

void push(Data const& data)
{
   boost::mutex::scoped_lock lock(the_mutex);
   the_queue.push(data);
   lock.unlock();
   the_condition_variable.notify_one();
}

我的問題是:

  1. 為什么在scoped_lock變量上調用了一個顯式的'lock.unlock()'?

  2. 它的目的是什么?

  3. 是否可以安全刪除,導致'notify_one'方法調用在scoped_mutex的范圍內?

解鎖不是必需的。 但是,它可能會減少互斥鎖被鎖定的時間。

保留或移除它不會影響線程安全或導致死鎖。

編輯:正如文章提到的那樣,將解鎖保留在那里可以減少對互斥鎖的爭用。 您也可以將其保留。或者,在互斥鎖周圍使用范圍,我個人發現,如果查看代碼,我會更好地突出顯示互斥鎖的范圍。

顯式鎖是這樣的,等待線程不被通知喚醒,只是必須阻塞互斥鎖。 這在前面鏈接到的文章中有解釋。

仍然使用scoped_lock的原因是為了確保在推送失敗的情況下正確解鎖互斥鎖並拋出異常。

第1點和第2點可以通過以下原則回答:您應該盡可能少地握住鎖。 一旦數據被推入隊列,您就不再需要鎖定它。

您可以按照建議移除解鎖,但需要將鎖定保持更長時間。

或者,可以通過添加新范圍來刪除解鎖本身,如下所示:

void push(Data const& data)
{
   { // new scope
      boost::mutex::scoped_lock lock(the_mutex);
      the_queue.push(data);
   } // scope ends, lock gets destroyed
   the_condition_variable.notify_one();
}

暫無
暫無

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

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