如何使推送和弹出队列成为原子,如何锁定这些操作

How to make push and pop on queue atomic, how to lock those operations?

本文关键字:何锁定 锁定 操作 何使推 队列      更新时间:2023-10-16

我使用队列在两个线程之间进行通信(一个线程只生成自定义类的实例并将指针推送到队列,另一个线程从自定义类上的队列指针中读取并进行一些计算)。如何使推送和弹出队列成为原子,如何锁定这些操作?(我不能使用C++11标准)

可能最可移植的非C++11锁定机制是Boost.Thread库中的同步类型。特别是互斥类为您提供了一个简单的可锁定对象,用于对资源进行独占访问。例如:

#include <boost/thread/mutex.hpp>
#include <queue>
template <typename T>
class locking_queue {
public:
    void push(T const & value) {
        boost::mutex::scoped_lock lock(mutex);
        queue.push(value);
    }
    bool pop(T & value) {
        boost::mutex::scoped_lock lock(mutex);
        if (queue.empty()) {
            return false;
        } else {
            value = queue.front();
            queue.pop();
            return true;
        }
    }
private:
    std::queue<T> queue;
    boost::mutex mutex;
};

另一个优点是,这与C++11 std::mutex类非常相似,如果您决定使用它,它将使转换变得非常简单。

这里有一个伪代码:

// Thread A
mutex.lock();
q.push();
mutex.unlock();
// Thread B
mutex.lock();
q.pop();
mutex.unlock();

如果您正在使用boost,您可以尝试它的互斥类。