From bd7e6f727919a9020af34daf57513e62300b3239 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Thu, 21 Jun 2018 12:09:32 -0400 Subject: [PATCH] Avoid false sharing of the two atomic variables of RingBuffer --- src/RingBuffer.h | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/RingBuffer.h b/src/RingBuffer.h index cdc5354b8..873ef2c12 100644 --- a/src/RingBuffer.h +++ b/src/RingBuffer.h @@ -39,10 +39,32 @@ class RingBuffer { size_t Filled( size_t start, size_t end ); size_t Free( size_t start, size_t end ); - sampleFormat mFormat; - std::atomic mStart { 0 }; - std::atomic mEnd { 0 }; + enum : size_t { CacheLine = 64 }; + /* + // We will do this in C++17 instead: + static constexpr size_t CacheLine = + std::hardware_destructive_interference_size; + */ + + // Align the two atomics to avoid false sharing + // TODO MSVC2017: use alignas +#ifdef __WXMSW__ + __declspec(align(64)) +#else + alignas(CacheLine) +#endif + std::atomic mStart { 0 }; + +#ifdef __WXMSW__ + __declspec(align(64)) +#else + alignas(CacheLine) +#endif + std::atomic mEnd{ 0 }; + const size_t mBufferSize; + + sampleFormat mFormat; SampleBuffer mBuffer; };