- 论坛徽章:
- 11
|
回复 73# wlmqgzm
你说你没有 spin?
bool enqueue(const T &data) {
if (buf[tail].load(std::memory_order_acquire) == invalid_val) {
buf[tail].store(data, std::memory_order_release);
tail = (tail + 1) % capacity;
return true;
}
return false;
}
bool dequeue(T &data) {
if (buf[head].load(std::memory_order_acquire) != invalid_val) {
data = buf[head].load(std::memory_order_relaxed);
buf[head].store(invalid_val, std::memory_order_release);
head = (head + 1) % capacity;
return true;
}
return false;
}
我猜应该是如下逻辑吧
enqueue:
read require
n = buf[tail]
if (n == invalid_val) {
buf[tail] = data;
}
write release
dequeue:
read require
n = buf[head]
buf[head] = invalid_val;
write release
好, 现在
dequeue 在:
buf[head] = invalid_val;
enqueue在
n = buf[tail]
其中 head == tail
现在, 因为 buf[head] = invalid_val; 已经执行了, 所以 n = buf[tail] 期待 n == invalid_val, 但 write release 还没做, 因此, n 可能 != invalid_val; 导致 false 退出
现在你告诉我, 你有没有 spin
|
|