gpt4 book ai didi

c++ - boost mutex, condition, scoped_lock ,我在这里用错了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:47 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com