Не могу сказать, что хорошо знаком с терминологией, но я так думаю.Я буду использовать определения .NET для терминов: " Операция приобрела семантику, если другие процессоры всегда будут видеть ее эффект до какого-либо последующего действия операции. Операция имеет семантику освобождения, если другие процессоры будут видеть эффект каждой предыдущей операции до эффектасамой операции."
Нет принудительного упорядочения между хранилищем и загрузкой в примере.Любой из них может быть выполнен первым.A синхронизируется с B, когда операция сохранения выполняется перед загрузкой.Когда это происходит, все операции до сохранения (деблокирования) гарантированно выполняются до выполнения операций после загрузки (захвата).
Однако операция загрузки может выполняться до сохранения.В этом случае A не синхронизируется с B (поскольку условие «и B читает значение, сохраненное A» не соответствует действительности), и поэтому операции после загрузки могут выполняться перед операциями, предшествующими хранилищу.Порядок нечеткий.
Семантика выпуска гарантирует, что для определенного значения x мы будем знать, что операции, предшествующие хранилищу, будут выполнены до того, как мы сможем загрузить то же самое сохраненное значение во второй поток (и домы можем выполнить операции после загрузки).
Предположим, что счетчик и флаг инициализируются нулями, а оба потока выполняются параллельно:
thread0:
st count, 1 (A)
st.release flag, 1 (B)
thread1:
ld.acquire flag (C)
ld count (D)
Мы знаем, что происходит A- до того, как произойдет B и C - до D, потому что их порядок навязывается освобождением и приобретает семантику.Порядок B и C не определен.Он становится определенным только тогда, когда B синхронизируется с C, и тогда мы знаем, что A происходит до D (как A происходит до B, до C происходит до D).
В потоке 1 счет всегда равен 1если флаг равен 1. Если флаг равен 0, счетчик может быть 0 или 1. Мы могли бы проверить флаг, чтобы определить, установил ли другой поток значение для счетчика.
Без семантики получения и освобождения нагрузкии хранилища могут быть переупорядочены, и оба флага и счет могут быть либо 0, либо 1 без зависимости друг от друга.
Если мы хотим гарантировать, что B произойдет до C, мы можем использовать семафоры или некоторое другое ожиданиеи сигнальный механизм.В предыдущем примере мы могли принудительно установить порядок, ожидая установленного флага.
thread1:
ld.acquire flag (C)
repeat C while flag == 0
ld count (D)