Я не понимаю, почему std :: memory_order_relaxed используется для сбоя
И я не понимаю, как вы жалуетесь на отсутствие семантики получения в этой ветке сбояне жалуйтесь на
head.load(std::memory_order_relaxed);
, а затем на
while(!head.compare_exchange_weak(new_node->next, new_node,
std::memory_order_release
, ни у одной из которых нет операции захвата "для синхронизации" с другой операцией, которую выне показывай намЧто это за другая операция, которая вас волнует?
Если эта операция важна, покажите эту операцию и скажите, используйте, как этот код зависит от "публикации" (или сигнала "Я закончил") этой другой операции. .
Ответ: функция push
никоим образом не зависит от публикации какого-либо сигнала "Я закончил" другой функцией , поскольку push не использует другие опубликованные данные,не читать другие отправленные элементы и т. д.
Почему бы не std :: memory_order_acquire вместо std :: memory_order_relaxed при сбое?
Для чего получить? Другими словами, чтобы наблюдать, какое достижение?
Значит ли std :: memory_order_relaxed при неудаче (потенциально) больше циклов?
Нет. Режим сбоя не имеет ничего общего с видимостью памяти;это функция механизма кэша ЦП.
РЕДАКТИРОВАТЬ:
Я только что видел текст на вашем изображении:
Не должен магазин из T2быть видимым в T1? (имея синхронизированную связь друг с другом)
На самом деле вы неправильно поняли синхронизированный с: он не распространяет значение считываемой атомарной переменной, поскольку атомарный по определению являетсяПримитив пригоден для использования с расой. Чтение атомарного всегда возвращает значение атомарной переменной , как написано некоторым другим потоком (или тем же самым потоком). Если бы это было не так, то никакая атомарная операция не имела бы смысла.
Нет необходимости упорядочивать память для чтения одной атомарной переменной.