From 9eb924f64a56918536d310dd89698aa7e148c727 Mon Sep 17 00:00:00 2001 From: lichao <lichao@aiotlink.com> Date: 星期四, 06 五月 2021 09:41:26 +0800 Subject: [PATCH] refactor atomic queue. --- src/robust.h | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/robust.h b/src/robust.h index b7459ad..aa54c2f 100644 --- a/src/robust.h +++ b/src/robust.h @@ -312,9 +312,10 @@ size_type i = 0; do { auto pos = tail(); - auto cur = buf[pos].load(); - r = Empty(cur) && buf[pos].compare_exchange_strong(cur, Enc(d)); - tail_.compare_exchange_strong(pos, Next(pos)); + if (tail_.compare_exchange_strong(pos, Next(pos))) { + auto cur = buf[pos].load(); + r = Empty(cur) && buf[pos].compare_exchange_strong(cur, Enc(d)); + } } while (try_more && !r && ++i < capacity); return r; } @@ -325,9 +326,10 @@ size_type i = 0; do { auto pos = head(); - cur = buf[pos].load(); - r = !Empty(cur) && buf[pos].compare_exchange_strong(cur, 0); - head_.compare_exchange_strong(pos, Next(pos)); + if (head_.compare_exchange_strong(pos, Next(pos))) { + cur = buf[pos].load(); + r = !Empty(cur) && buf[pos].compare_exchange_strong(cur, 0); + } } while (try_more && !r && ++i < capacity); if (r) { d = Dec(cur); } return r; -- Gitblit v1.8.0