是否存在与解锁警卫相关的已知问题:
unique_lock<mutex> lock(smtx);
// ...
{ // non locked block
reverse_lock< unique_lock<mutex> > rlock(lock);
// ...
} // locked again
// ...
这可能会使这通常成为一种反模式?
有人建议在我的一个代码审查中避免使用它,但没有明确解释原因。
答案 0 :(得分:0)
不确定它是否是反模式。虽然我希望在可能的情况下使用范围锁定,但使用条件变量时,使用纯范围锁定并不容易。
我在这些情况下使用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);
}
}
}