Атомная семантика C / C ++ гарантирует только видимость (через отношение «случай до») операций памяти, выполняемых последним потоком, который выполнил «простую» операцию записи (без чтения-изменения-записи). (Существует строгая семантическая дискриминация между операциями записи и RMW.)
Рассмотрим
int x, y;
atomic<int> a;
Тема 1:
x = 1;
a.store(1,memory_order_release);
Тема 2:
y = 2;
if (a.load(memory_order_relaxed) == 1))
a.store(2,memory_order_release);
Тогда наблюдение a == 2
подразумевает видимость операций потока 2 (y == 2
), но не потока 1 (невозможно даже прочитать x
).
Насколько мне известно, в реальных реализациях многопоточности используются концепции заборов (и иногда релиз-хранилище), но не происходит до-или-релиз-последовательность, которые являются концепциями высокого уровня C / C ++; Я не могу понять, с какими деталями реального оборудования соответствуют эти концепции.
Как реальная реализация не может гарантировать видимость операций с памятью потока 1, когда значение 2 в a
является глобально видимым?
Другими словами, есть ли польза в определении последовательности выпуска? Почему последовательность выпуска не распространяется на каждую последующую модификацию в порядке модификации?
Рассмотрим, в частности, глупую нить 3:
if (a.load(memory_order_relaxed) == 2))
a.store(2,memory_order_relaxed);
Может ли silly-thread 3 подавить какие-либо гарантии видимости на любом реальном оборудовании? Другими словами, если значение 2 является глобально видимым, как сделать его снова глобально видимым, чтобы нарушить любой порядок?
Не верна ли моя ментальная модель реальной многопроцессорности? Может ли значение, частично видимое, на одном процессоре, но отметить другое?
(Конечно, я предполагаю ненормальную семантику для расслабленных записей, поскольку записи, которые уходят в прошлое, делают семантику языка C / C ++ абсолютно бессмысленной, в отличие от безопасных языков, таких как Java, которые всегда имеют ограниченную семантику. Ни одна реальная реализация не может иметь сумасшедших не причинно-следственная расслабленная семантика.)