Вопрос What happens...
касается различных уровней абстракции (пользовательская земля к оборудованию).
На самом деле What happens
относится к аппаратному уровню:
Есть два одновременных (в основном, происходят в один и тот же машинный цикл) обращается к одному и тому же физическому адресу памяти.
Там возникают следующие 3 возможности: (При наличии адреса памяти X
с содержанием C(X)
, равным x0
.)
а) при двух чтениях будет достигнут определенный результат c: оба будут наблюдать x0
как значение.
b) одно чтение, одна запись (значение: x1
), которую может наблюдать читатель x0
или x1
, в зависимости от порядка доступа (см. Ниже).
c) две записи (значения: x1
, x2
), затем может быть получено окончательное содержимое C(X)
в конечном итоге получится x1
или x2
, в зависимости от порядка (см. ниже)
В случаях b) и c) у наблюдателя может возникнуть впечатление недетерминированного поведения c. Однако базовое поведение на самом деле все еще детерминировано c.
Фактический результат этих одновременных (at the same time
) обращений определяется деталями оборудования. В основном:
- стратегия выделения шины
- стратегия когерентности кэша
Фактическая используемая ОС не окажет существенного влияния на это поведение. Вопрос уже требует разделяемой памяти между (большими уровнями) исполнительными блоками (потоками в вопросе), но процессы (отдельная память по умолчанию), использующие сегменты разделяемой памяти, будут вести себя аналогично. Любое использование механизмов синхронизации (блокировки, семафоры) просто предотвратит одновременный доступ и таким образом исключит одновременный доступ.
Вы можете подумать об операциях atomi c (обычно выполняющих монопольное чтение-модификацию- цикл записи в физическую память), поскольку это позволит исполняющему блоку выполнить некоторый указатель «знать», произошла ли какая-либо «другая» операция, и это вызывает более детерминированный порядок операций c.