【发布时间】:2011-05-07 05:24:29
【问题描述】:
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 永远不会返回。
do_something 在这里我认为不是无关紧要的。
我在这里做错了什么?
奇怪的是,上面的代码在 mac 下运行良好,但我在 linux 上遇到了问题。
升压版本是 1.44.0
谢谢
【问题讨论】:
-
什么是
do_something?谁打电话给PushMessage?这段代码充其量是不完整的。 -
线程库中没有
boost::condition。你的意思是boost::condition_variable?正如所写的那样,通过该修复程序,您的代码在带有 boost 1.42 和 boost 1.46(手头没有 1.44)的 linux 上运行,并且没有显示您描述的问题。