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

avatar
作者
猴君
阅读量:0

要实现一个线程安全的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的操作是线程安全的。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!