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