Почему порядок памяти должен быть «Получить» в реализации с одним потребителем при сравнении значений указателяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему порядок памяти должен быть «Получить» в реализации с одним потребителем при сравнении значений указателя

Сообщение Anonymous »

Это реализация для одного потребителя и нескольких производителей, переведенная с Rust, для вопросов языкового юриста, переписанная на C++

Код: Выделить всё

template
struct Node{
std::atomic next;
T value;
Node(T v):value(v),next(){}
};
template
struct Queue {
std::atomic head;
Node* tail;
Queue(){
auto h = new Node{T{}};
head.store(h);
tail = h;
}
void push(T t){
auto node = new Node{};
auto pre = this->head.exchange(node,std::memory_order::acq_rel);
pre->next.store(node,std::memory_order::release);
}
T pop(){
auto tail = this->tail;
auto next = tail->next.load(std::memory_order::acquire);
if(next){
this->tail = next;
auto ret = next->value;
delete next;
return ret;
}
if (this->head.load(std::memory_order::acquire) == tail){  // #1
throw "empty";
}else{
throw "Inconsistent";
}
}
};
Интересно, почему порядок памяти в #1 должен быть Acquire? Цель состоит только в том, чтобы сравнить, равны ли хвост значения указателя и значение указателя, хранящееся в this->head, что не позволяет получить доступ к референту, на который указывает значение указателя. В отличие от вышеописанного, где требуется доступ к референту после загрузки, для этого требуется, чтобы инициализация узла произошла до доступа к узлу. Итак, почему порядок памяти в #1 не может быть Memory_order::relaxed?


Подробнее здесь: https://stackoverflow.com/questions/797 ... implementa
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»