我正在研究单生产者单消费者环形缓冲区实现,我有两个要求:
1)将环形缓冲区的单个堆分配实例与高速缓存行对齐。
2)将环形缓冲区中的字段与高速缓存行对齐(以防止错误共享)。
我的课看起来像这样:
#define CACHE_LINE_SIZE 64 // To be used later.
template
class RingBuffer { // This needs to be aligned to a cache line.
public:
....
private:
std::atomic publisher_sequence_ ;
int64_t cached_consumer_sequence_;
T* events_;
std::atomic consumer_sequence_; // This needs to be aligned to a cache line.
};
让我首先解决点1,即对齐类的单个堆分配实例。有几种方法:
1)使用c ++ 11 alignas(..)说明符:
template
class alignas(CACHE_LINE_SIZE) RingBuffer {
public:
....
private:
// All the private fields.
};
2)使用posix_memalign(..) +放置new(..)而不更改类定义。这受制于与平台无关的问题:
void* buffer;
if (posix_memalign(&buffer, 64, sizeof(processor::RingBuffer)) != 0) {
perror("posix_memalign did not work!");
abort();
}
// Use placement new on a cache aligned buffer.
auto ring_buffer = new(buffer) processor::RingBuffer();
3)使用GCC / Clang扩展名__attribute__ ((aligned(#)))
template
class RingBuffer