26 size_t head =
head_pos.load(std::memory_order_acquire);
27 size_t tail =
tail_pos.load(std::memory_order_acquire);
28 for (
size_t i = head; i != tail; ++i)
39 size_t head =
head_pos.load(std::memory_order_relaxed);
40 size_t tail =
tail_pos.load(std::memory_order_relaxed);
41 for (
size_t i = head; i != tail; ++i)
48 for (
size_t i = 1; i <=
sizeof(
void*) * 4; i <<= 1)
56 p_node[i].
tail.store(i, std::memory_order_relaxed);
57 p_node[i].
head.store(
size_t(-1), std::memory_order_relaxed);
60 tail_pos.store(0, std::memory_order_relaxed);
61 head_pos.store(0, std::memory_order_relaxed);
68 size_t head =
head_pos.load(std::memory_order_seq_cst);
69 size_t tail =
tail_pos.load(std::memory_order_seq_cst);
76 size_t head =
head_pos.load(std::memory_order_seq_cst);
77 size_t tail =
tail_pos.load(std::memory_order_seq_cst);
86 size_t head =
head_pos.load(std::memory_order_relaxed);
91 if (node->
head.load(std::memory_order_acquire) != head)
return false;
92 if (
head_pos.compare_exchange_weak(head, head + 1,
93 std::memory_order_relaxed))
96 result = std::move(*node->
ptr());
103 size_t head =
head_pos.load(std::memory_order_acquire);
104 size_t tail =
tail_pos.load(std::memory_order_acquire);
105 for (
size_t i = head; i != tail; ++i) {
110 head_pos.store(tail, std::memory_order_release);
123 template <
typename U>
126 size_t tail =
tail_pos.load(std::memory_order_relaxed);
131 if (node->
tail.load(std::memory_order_acquire) != tail)
return false;
132 if (
tail_pos.compare_exchange_weak(tail, tail + 1,
133 std::memory_order_relaxed))
136 new (node->
ptr())
T(std::forward<U>(
val));
137 node->
head.store(tail, std::memory_order_release);