[英]boost mutex, condition, scoped_lock , am I using them wrong here?
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仍包含鎖時,至少您不會讓線程2嘗試調用lock.lock()
。
我認為您需要2個互斥對象,一個用於在不同線程中同步方法調用,一個用於條件等待。 你把它們混合了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.