解锁后卫(或者boost :: reverse_lock)是一种反模式吗?为什么?

时间:2016-04-01 17:43:24

标签: c++ multithreading locking

是否存在与解锁警卫相关的已知问题:

 unique_lock<mutex> lock(smtx); 

 // ... 

 { // non locked block 
     reverse_lock< unique_lock<mutex> > rlock(lock); 

     // ...
 } // locked again 

 // ... 

这可能会使这通常成为一种反模式?

有人建议在我的一个代码审查中避免使用它,但没有明确解释原因。

1 个答案:

答案 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);
        }
    }
}