class MyClass
{
public:
void PushMessage(MyMessage m) // Thread 1 calls this
{
boost::mutex::scoped_lock lock(mMutex);
mQueue.push_back(m);
mCondition.notify_one();
}
MyMessage PopMessage()
{
boost::mutex::scoped_lock lock(mMutex);
while(mQueue.empty())
mCondition.wait(lock);
MyMessage message = mQueue.front();
mQueue.pop_front();
return message;
}
void foo() // thread 2 is running this loop, and supposed to get messages
{
for(;;)
{
MyMessage message = PopMessage();
do_something(message);
}
}
private:
std::deque<MyMessage> mQueue;
boost::mutex mMutex;
boost::condition mCondition;
};
私は、コードを実行すると、PushMessage
が呼び出され、そしてfoo()
はPopMessage()
に待っているが、PopMessage
を返すことはありません。boost mutex、condition、scoped_lock、私はここで間違って使っていますか?
do_something
はここでは無関係ではないと思います。
私はここで間違っていますか? 不思議なことに、上記のコードはMacで正常に動作しましたが、Linuxで問題があります。
ブーストバージョンは1.44.0
は、私はあなたが1の状態待機のためである1が別のスレッドでメソッド呼び出しを同期させるためである2つのミューテックスオブジェクトを、必要だと思うあなた
「do_something」とは何ですか?誰が 'PushMessage'を呼びますか?このコードは、せいぜい不完全です。 – ildjarn
スレッドライブラリに 'boost :: condition'はありません。あなたは 'boost :: condition_variable'を意味しましたか?書かれているように、そしてその修正を加えれば、あなたのコードはlinuxで1.42のブーストと1.46のブーストで動作します(1.44は手元にありません)。 – Cubbi