首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++线程安全环形缓冲区实现

c++线程安全环形缓冲区实现
EN

Stack Overflow用户
提问于 2013-09-28 04:14:33
回答 1查看 9.8K关注 0票数 4

我正在用C++做多线程编程,我想知道在C++中是否有一个线程安全的环形缓冲区实现,或者你知道我如何实现它。

EN

回答 1

Stack Overflow用户

发布于 2013-09-28 04:37:07

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

如果c++11不可用,请用适当的编译器替换head_tail_的原子化。

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

通过调用以下方法发布项:

代码语言:javascript
复制
  auto val = ringbuffer.back();
  val = some_value;
  ringbuffer.push();

通过调用以下方法检索项:

代码语言:javascript
复制
  auto val = ringbuffer.front();
  // do stuff with val
  ringbuffer.pop();

如果back()返回一个nullptr,那么缓冲区就是“已满”。如果front()返回nullptr,则缓冲区为“空”。

警告,未测试(完全) :D

代码语言:javascript
复制
  #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_;
  };
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19059336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档