簡體   English   中英

增強互斥鎖,條件,scoped_lock,我在這里使用錯嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM