作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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 上遇到了问题。
boost 版本是1.44.0
谢谢
最佳答案
与其让锁定对象的作用域在解锁之前过期,不如在解锁等待线程之前尝试手动解锁 PushMessage()
中的互斥量,即,
void PushMessage(MyMessage m) // Thread 1 calls this
{
boost::mutex::scoped_lock lock(mMutex);
mQueue.push_back(m);
lock.unlock(); // <== manually unlock
mCondition.notify_one();
}
这样当线程 2 解除阻塞时,将不会出现线程 1 包含锁和线程 2 试图获取您的互斥锁的“交叉”时间。我不明白为什么这会产生问题,但至少你不会让线程 2 尝试调用 lock.lock()
而线程 1 仍然包含锁。
关于c++ - boost mutex, condition, scoped_lock ,我在这里用错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919311/
我是一名优秀的程序员,十分优秀!