C++ RingBuffer如何实现线程安全

   2024-10-01 5740
核心提示:要实现一个线程安全的RingBuffer,可以使用互斥锁(mutex)来保护读写操作。具体的实现方法如下:#include mutex#include condit

要实现一个线程安全的RingBuffer,可以使用互斥锁(mutex)来保护读写操作。具体的实现方法如下:

#include <mutex>#include <condition_variable>#include <atomic>#include <vector>template <typename T>class RingBuffer {public:    RingBuffer(size_t size) : buffer(size), head(0), tail(0), count(0) {}    void push(const T& item) {        std::unique_lock<std::mutex> lock(mutex);        not_full.wait(lock, [this]{ return count < buffer.size(); });                buffer[tail] = item;        tail = (tail + 1) % buffer.size();        ++count;                not_empty.notify_one();    }    T pop() {        std::unique_lock<std::mutex> lock(mutex);        not_empty.wait(lock, [this]{ return count > 0; });        T item = buffer[head];        head = (head + 1) % buffer.size();        --count;        not_full.notify_one();        return item;    }private:    std::vector<T> buffer;    size_t head;    size_t tail;    size_t count;    std::mutex mutex;    std::condition_variable not_full;    std::condition_variable not_empty;};

在上面的代码中,使用了std::mutex来保护对RingBuffer的读写操作。在push和pop方法中,使用了std::unique_lock来加锁,并在需要的时候通过条件变量(std::condition_variable)等待或唤醒线程。这样就可以保证多个线程对RingBuffer的操作是线程安全的。

 
举报打赏
 
更多>同类物流大全
推荐图文
推荐物流大全
点击排行

网站首页  |  关于我们  |  联系方式 | 网站留言    |  赣ICP备2021007278号