Видит ли второй поток новое значение при следующей операции загрузки?
Если следующая операция load
происходит после store
в порядке модификации этого атома c переменная затем load
считывает значение из этого store
.
См. std::memory_order
для получения полной информации:
Порядок модификации
Все модификации любой конкретной переменной atomi c происходят в общем порядке, который указан c для этой переменной atomi c.
. ..
когерентность записи-чтения: если побочный эффект (запись) X на атоме c объекта M происходит - до вычисления значения (чтения) B из M, то оценка B должна принимать свое значение от X или от побочного эффекта Y, который следует за X в порядке изменения M
Кроме того, в [atomics.order]
стандарт говорит, что :
Реализации должны сделать хранилища atomi c видимыми для загрузок atomi c в течение разумного промежутка времени.
На практике это означает, что компилятор выдает эти инструкции сохранения и загрузки, а затем до аппаратного обеспечения для распространения сохраненного значения и сделать его видимым для других процессоров. Процессоры x86 используют буфер хранения, так что сохраненное новое значение сначала попадает в буфер хранения и становится видимым для других процессоров через некоторое (небольшое) время после того, как он покинул буфер хранения. В течение этого времени ЦП, который сохранил значение, может прочитать его обратно из буфера хранилища, но другие ЦП не могут.
Дополнительная информация: Как сделать так, чтобы хранилища памяти в одном потоке «быстро» были видны в другие темы?