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

标签 c++ multithreading concurrency thread-safety

我想知道这是否是用 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/

相关文章:

c++ - SDL 对渲染的怀疑

c++ - 编译一段最简单的代码时,VC++ 编译器崩溃

c++ - cmake,关于 include_directories 的说明

c++ - 如何阻止 QXmlStreamWriter 转义引号?

Java 套接字帮助客户端-服务器

mysql并发: what happens if a locked table is accessed?

java - 同步关键字 - 它是如何工作的?

Android:从后台线程引发 AlertDialog

java - 在阻塞队列上等待时中断

java - Android 2.1 SDK + ConcurrentHashMap$ValueIterator 与 GC