gpt4 book ai didi

c++ - 这是线程安全 Queue 类的正确方法吗?

转载 作者:可可西里 更新时间:2023-11-01 18:01:46 26 4
gpt4 key购买 nike

我想知道这是否是用 C++ 编写线程安全队列的正确方法?

template <class T>
class Queue
{
public:

Queue() {}

void Push(T& a)
{
m_mutex.lock();
m_q.push_back(a);
m_mutex.unlock();
}

T& Pop()
{
m_mutex.lock();
T& temp = m_q.pop();
m_mutex.unlock();
return temp;
}

private:
std::queue<t> m_q;
boost::mutex m_mutex;
};

你明白了……我只是想知道这是否是最好的方法。谢谢!

编辑:由于我收到的问题,我想澄清互斥锁是一个 boost::mutex

最佳答案

我推荐使用 the Boost threading libraries帮助您解决这个问题。

你的代码很好,除了当你用 C++ 编写代码时,比如

some_mutex.lock();
// do something
some_mutex.unlock();

那么如果 //do something 部分的代码抛出异常,那么锁将永远不会被释放。 Boost 库通过它的类解决了这个问题,例如 lock_guard在其中初始化一个对象,该对象在其构造函数中获取锁,并且其析构函数释放锁。这样你就知道你的锁总是会被释放。其他语言通过 try/finally 语句完成此操作,但 C++ 不支持此构造。

特别是,当您尝试从没有元素的队列中读取时会发生什么?那会抛出异常吗?如果是这样,那么您的代码就会遇到问题。

当试图获取第一个元素时,您可能想检查是否有东西存在,如果没有就去 sleep ,等到有东西存在。这是一份 condition 的工作对象,也由 Boost 库提供,但如果您愿意,可以在较低级别使用。

关于c++ - 这是线程安全 Queue 类的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1583834/

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