[英]Is unlock guard (or boost::reverse_lock) a anti-pattern? Why?
是否存在與解鎖衛士有關的已知問題:
unique_lock<mutex> lock(smtx);
// ...
{ // non locked block
reverse_lock< unique_lock<mutex> > rlock(lock);
// ...
} // locked again
// ...
可以使這通常成為反模式嗎?
建議在我的代碼審查之一中避免使用此方法,而無需明確說明原因。
不確定是否是反模式。 雖然我更願意在可能的情況下使用范圍鎖定,但是使用條件變量時,使用純范圍鎖定並不容易。
在以下情況下,我使用reverese_lock:
void WorkQueue::Run()
{
boost::unique_lock<boost::mutex> lck(m_mtxQueue);
for (;;)
{
// wait for an item to be pushed
while (m_deqItems.empty())
{
m_cvAvailable.wait(lck);
}
// signal worker thread(s) to process items
if (!m_deqItems.empty())
{
Item item = m_deqItems.front();
m_deqItems.pop_front();
// unlock during (lengthy) processing of an item
boost::reverse_lock<boost::unique_lock<boost::mutex>> unlck(lck);
ProcessItem(item);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.