c++ - 解锁保护(或 boost::reverse_lock)是反模式吗?为什么?

标签 c++ multithreading locking

是否存在与解锁防护相关的已知问题:

 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/

相关文章:

java - Apache 会杀死长时间运行的页面请求线程吗?

multithreading - 互斥锁 : what does "blocking" mean?

sql-server - SQL Server 中的永久行级锁定

c++ - 在 NetBeans 7.2 中找不到 io.h

c++ - 如何使用 gdb 调试插件

c++ - std::shared_ptr 的 std::map 中的线程安全

c - 我如何创建一个与 C 游戏同时工作的计时器?

multithreading - 如果我有 1 个线程写入和 1 个线程读取 int32,它是线程安全的吗?

c++ - 从文件中读取 double

c++ - 使用 std::ios::ate 获取文件大小?