尝试等待boost :: condition_Variable时,"unique_lock没有互斥锁:操作不允许"错误

Tim*_* MB 0 c++ multithreading boost boost-thread c++11

我正在尝试使用boost :: wait_condition来休眠一个线程,直到有一些新数据可用.我的功能减少到这个:

bool Node::waitForNewData() const
{
    boost::unique_lock<boost::mutex>(mWasNotifiedMutex);
    mWasNotified = false;
    while (true)
    {
        if (mWasNotified)
            return true;
        if (mThreadIsRequestedToStop)
            return false;
        mWasNotifiedWaitCondition.wait(mWasNotifiedMutex);
    }
}
Run Code Online (Sandbox Code Playgroud)

Boost使用以下消息从wait()函数抛出异常:

boost unique_lock has no mutex: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的函数来通知等待条件:

void Node::callbackNewDataArrived()
{
    {
        boost::unique_lock<boost::mutex>(mHasNewInletDataMutex);
        mWasNotified = true;
    }
    mWasNotifiedWaitCondition.notify_all();
}
Run Code Online (Sandbox Code Playgroud)

以及标题中的这些声明:

class Node
{
    // ...
    mutable bool mWasNotified;
    mutable boost::mutex mWasNotifiedMutex;
    mutable boost::condition_variable mWasNotifiedWaitCondition;
    std::atomic<bool> mThreadIsRequestedToStop;
};
Run Code Online (Sandbox Code Playgroud)

我在Xcode 4.6.2中构建,在OSX 10.8.5上启用了c ++ 11支持.我的boost库是用它构建的

./b2 toolset=clang cxxflags="-std=c++11 -stdlib=libc++ -arch i386 -arch x86_64" macosx-version=10.6 linkflags="-stdlib=libc++" --prefix=/usr/local -j 10 define=BOOST_SYSTEM_NO_DEPRECATED stage release
Run Code Online (Sandbox Code Playgroud)

和我链接的boost库是

libboost_chrono.a
libboost_date_time.a
libboost_filesystem.a
libboost_system.a
libboost_thread.a
Run Code Online (Sandbox Code Playgroud)

知道我在这里做错了吗?

Mik*_*our 5

boost::unique_lock<boost::mutex>(mWasNotifiedMutex);
Run Code Online (Sandbox Code Playgroud)

这声明了一个空锁,称为mWasNotifiedMutex隐藏互斥锁本身.您打算使用互斥锁初始化锁:

boost::unique_lock<boost::mutex> lock(mWasNotifiedMutex);
Run Code Online (Sandbox Code Playgroud)

然后你需要给条件变量而不是互斥量:

mWasNotifiedWaitCondition.wait(lock);
Run Code Online (Sandbox Code Playgroud)