我正在C++中进行多线程编程,我在想C++中是否有线程安全的环形缓冲区实现,或者您是否知道如何实现它。C++ threadsafe环缓冲区实现
4
A
回答
-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();
Retreive项目:
通过调用发布项目
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_;
};
0
相关问题
- 1. debugfs - 环形缓冲区实现-linux
- 2. 如何在C中实现循环列表(环形缓冲区)?
- 3. 在C中实现双缓冲区
- 4. C双缓冲区实现死锁?
- 5. 级联(缓冲区)实现
- 6. 使用deque在C++中实现循环缓冲区
- 7. 问题有关C实现循环缓冲区的
- 8. 针对FIR滤波器的循环缓冲区实现C
- 9. 具有可变大小项目的循环缓冲区实现
- 10. 循环数组/缓冲区实现中的NullReferenceException
- 11. 如何使用文件实现循环缓冲区?
- 12. 向量引用缓冲区实现
- 13. 如何实现共享缓冲区?
- 14. 实现z缓冲区的好方法
- 15. 使用OpenGL实现Z缓冲区
- 16. Linux缓冲区是如何实现的?
- 17. 实现istream获取字符缓冲区?
- 18. Java中的抖动缓冲区实现
- 19. 循环字符数组缓冲区 - c
- 20. C++简单循环缓冲区队列
- 21. C上的环形缓冲区
- 22. C基本环形缓冲区问题
- 23. 作为“FIFO队列”的Javascript循环缓冲区队列实现
- 24. 如何在SelectListItems列表中实现循环缓冲区?
- 25. 如何在Python中实现循环缓冲区?
- 26. 此循环缓冲区实现是否需要信号量?
- 27. 如何在黑莓或Java中实现循环缓冲区?
- 28. 磁盘上的循环缓冲区实现
- 29. Linux内核空间中的“魔术环缓冲区”实现?
- 30. cuda使用循环缓冲区的核心外实现
也许http://stackoverflow.com/questions/9743605/thread-safe-循环缓冲的实现回答你的问题 – villekulla
当只有一个线程写入另一个线程读取时,你在寻找特殊情况吗?或者你想要一个通用的解决方案? – paddy
实现任何线程安全容器相对容易,除非性能是您的驱动因素。你究竟在寻找什么? – Chad