是否存在与解锁防护相关的已知问题:
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);
}
}
}
关于c++ - 解锁保护(或 boost::reverse_lock)是反模式吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36362620/