我习惯于进行线程编程时遇到问题。我试图用互斥锁和锁构建一个构造。但是我需要使用两个锁作为参数的boost::condition_variable::wait。但是没有两个锁的等待功能。

有人给我个提示吗,还是我的方法完全错误?

我的目的是

  • 允许并发add(),将所有内容写入
  • 缓冲区
  • worker 线程operator()(),存储缓冲值
  • 和search(),在搜索
  • 之前等待工作线程
    
    
        class Archive
        {
            vector externalBuffer;
            vector swapBuffer;
            vector internalBuffer;
            boost::mutex externalBufferMutex;
            boost::mutex allBufferMutex;
            boost::condition_variable bufferIsFilledConditionVariable;
    
            void operator () ()
            {
                unique_lock allBufferLock(allBufferMutex);
                while(true)
                {
                    {
                        unique_lock lock(externalBufferMutex);
                        while(buffer.empty())
                        {
                            bufferIsFilledConditionVariable.wait(...); // I should call it with two locks?
                        }
                        externalBuffer.swap(swapBuffer);
                    }
    
                    {
                        internalBuffer.swap(swapBuffer);
                        // store values from internalBuffer
                        ...
                        internalBuffer.clear();
                    }
                }
            }
    
            void add(value) // pseudo code here
            {
                {
                    lock_guard lock(externalBufferMutex);
                    externalBuffer.push_back(value);
                }
                bufferIsFilledConditionVariable.notify_one();
            }
    
            // search will not be used concurrently with add()
            // it should just wait for the worker thread
            someReturnValue search()
            {
                unique_lock lock(allBufferMutex);
                // search here
                ...
            }
    
        }
    
    

    最佳答案

    我不确定您要实现的目标,通常,应避免在多个重叠的锁下进行操作。

    但是,通常也要避免死锁,您只需使用一致的锁顺序即可。非成员lock函数可以帮助您:

  • http://www.boost.org/doc/libs/1_56_0/doc/html/thread/synchronization.html#thread.synchronization.lock_functions.lock_multiple

  • http://en.cppreference.com/w/cpp/thread/lock(适用于c++ 11)

  • 例子
    unique_lock lk_all(allBufferMutex,      boost::defer_lock);
    unique_lock lk_ext(externalBufferMutex, boost::defer_lock);
    boost::lock(lk_all, lk_ext);
    
    while(internalBuffer.empty())
    {
        lk_all.unlock();
        bufferIsFilledConditionVariable.wait(lk_ext);
        boost::lock(lk_all, lk_ext);
    }
    

    这未经测试,但可能会对您有所帮助

    关于c++ - boost condition_variable等待多个锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26628401/

    10-10 13:42