0

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

Boost は、次のメッセージを含む wait() 関数から例外をスローしています。

boost unique_lock has no mutex: Operation not permitted

待機状態を通知するために、次のような関数を使用しています。

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

およびヘッダー内のこれらの宣言:

class Node
{
    // ...
    mutable bool mWasNotified;
    mutable boost::mutex mWasNotifiedMutex;
    mutable boost::condition_variable mWasNotifiedWaitCondition;
    std::atomic<bool> mThreadIsRequestedToStop;
};

OSX 10.8.5でc++ 11サポートを有効にして、Xcode 4.6.2でビルドしています。私のブーストライブラリはで構築されました

./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

私がリンクしているブーストライブラリは

libboost_chrono.a
libboost_date_time.a
libboost_filesystem.a
libboost_system.a
libboost_thread.a

ここで何が間違っているのか分かりますか?

4

2 に答える 2

5
boost::unique_lock<boost::mutex>(mWasNotifiedMutex);

という空のロックを宣言しmWasNotifiedMutex、ミューテックス自体を隠します。ロックを初期化するためにミューテックスを使用するつもりでした:

boost::unique_lock<boost::mutex> lock(mWasNotifiedMutex);

次に、ミューテックスではなく、条件変数にそれを与える必要があります。

mWasNotifiedWaitCondition.wait(lock);
于 2013-10-21T18:23:13.163 に答える
0

へのリンクを忘れた可能性がありますpthread:

-lpthread
于 2013-10-21T18:16:43.963 に答える