阅读量: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的操作是线程安全的。