我不习惯在互联网上发布任何问题,所以如果我做错了什么,请告诉我。
如何在 CPU 缓存行大小为 64 字节的 64 位架构上正确防止错误共享?
C++ 'alignas' 关键字和简单字节数组(例如:char[64])的使用如何影响多线程效率?
在研究Single Consumer Single Producer Queue的非常有效的实现时,我在对我的代码进行基准测试时遇到了 GCC 编译器的不合逻辑行为。
我希望有人有必要的知识来解释正在发生的事情。
我目前在 arch linux 上使用 GCC 10.2.0 及其 C++ 20 实现。我的笔记本电脑是带有 i7-7500U 处理器的联想 T470S。
让我从数据结构开始:
class SPSCQueue
{
public:
...
private:
alignas(64) std::atomic<size_t> _tail { 0 }; // Tail accessed by both producer and consumer
Buffer _buffer {}; // Buffer cache for the producer, equivalent to _buffer2
std::size_t _headCache { 0 }; // Head cache for the …Run Code Online (Sandbox Code Playgroud)