提升互斥锁、条件scoped_lock,我在这里用错了吗

boost mutex, condition, scoped_lock , am I using them wrong here?

本文关键字:lock 在这里 错了 scoped 条件      更新时间:2023-10-16
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

谢谢

与其让锁定对象的作用域在解锁之前过期,不如尝试在取消阻止等待线程之前手动解锁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 个互斥对象,一个用于同步不同线程中的方法调用,一个用于条件等待。你把它们混了。