[英]Extraneous call to unlock on scoped_lock
在以下博文中:
有一個'推送'方法定義如下:
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
我的問題是:
為什么在scoped_lock變量上調用了一個顯式的'lock.unlock()'?
它的目的是什么?
是否可以安全刪除,導致'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.