From 7bffcfa79097ec54be07a5a384eed588be2b197e Mon Sep 17 00:00:00 2001 From: Alexandr Nikitin Date: Wed, 24 Jan 2018 12:06:38 +0200 Subject: [PATCH] Compare then Compare And Swap --- src/MPMCQueue.NET/MPMCQueue.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MPMCQueue.NET/MPMCQueue.cs b/src/MPMCQueue.NET/MPMCQueue.cs index e0abb23..8155f03 100644 --- a/src/MPMCQueue.NET/MPMCQueue.cs +++ b/src/MPMCQueue.NET/MPMCQueue.cs @@ -42,7 +42,7 @@ public bool TryEnqueue(object item) var pos = _enqueuePos; var index = pos & _bufferMask; var cell = buffer[index]; - if (cell.Sequence == pos && Interlocked.CompareExchange(ref _enqueuePos, pos + 1, pos) == pos) + if (cell.Sequence == pos && _enqueuePos == pos && Interlocked.CompareExchange(ref _enqueuePos, pos + 1, pos) == pos) { buffer[index].Element = item; Volatile.Write(ref buffer[index].Sequence, pos + 1); @@ -65,7 +65,7 @@ public bool TryDequeue(out object result) var pos = _dequeuePos; var index = pos & bufferMask; var cell = buffer[index]; - if (cell.Sequence == pos + 1 && Interlocked.CompareExchange(ref _dequeuePos, pos + 1, pos) == pos) + if (cell.Sequence == pos + 1 && _dequeuePos == pos && Interlocked.CompareExchange(ref _dequeuePos, pos + 1, pos) == pos) { result = cell.Element; buffer[index].Element = null;