c ++ threadsafe ringbuffer实现

时间:2013-09-27 20:14:33

标签: c++ thread-safety circular-buffer

我正在使用C ++进行多线程编程,我想知道在C ++中是否存在一个线程安全的ringbuffer实现,或者您是否知道如何实现它。

1 个答案:

答案 0 :(得分:-1)

这是一个基本的实现。要求存储在缓冲区中的对象是默认可构造的,并且是可复制的(通过将它们存储在std :: vector<>中)。需要C++11支持(std::atomic)。大多数最新版本的gcc都会将-std=c++11-std=c++0x

包含在内

如果c++11不可用,请使用适当的编译器内在代替head_tail_原子。

对于一个读者线程和一个编写器线程应该是安全的。

通过调用发布项目:

  auto val = ringbuffer.back();
  val = some_value;
  ringbuffer.push();

通过致电:

来检索项目
  auto val = ringbuffer.front();
  // do stuff with val
  ringbuffer.pop();

如果back()返回nullptr,则缓冲区为“已满”。如果front()返回nullptr,则缓冲区为“空”。

警告,未经测试(根本没有):D

  #include <vector>

  template <class T>
  class RingBuffer
  {
  public:
     RingBuffer(size_t buffer_size)
        : ring_(buffer_size)
        , buffer_size_(buffer_size)
        , head_(0)
        , tail_(0)
     {
     }

     T* back()
     {
        bool received = false;

        if(available(head_, tail_))
        {
           return &(ring_[head_ % buffer_size_]);
        }

        return nullptr;
     }

     void push()
     {
        ++head_;
     }

     T* front()
     {
        if(tail_ < head_)
        {
           return & ring_[tail_ % buffer_size_];
        }

        return nullptr;
     }

     void pop()
     {
        ++tail_;
     }

     size_t size() const
     {
        if(tail_ < head_)
           return buffer_size_ - ((tail_ + buffer_size_) - head_);
        else if(tail_ > head_)
           return buffer_size_ - (tail_ - head_);

        return 0;
     }

     bool available()
     {
        return available(head_, tail_);
     }

  private:
     bool available(uint64_t h, uint64_t t) const
     {
        if(h == t)
           return true;
        else if(t > h)
           return (t - h) > buffer_size_;
        else// if(h > t)
           return (t + buffer_size_) - h > 0;
     }

     std::vector<T> ring_;
     const size_t   buffer_size_;
     std::atomic<uint64_t> head_;
     std::atomic<uint64_t> tail_;
  };