Примите логическое значение.Один поток пытается присвоить ему заранее определенное значение, и в то же время другой поток пытается его прочитать.Что происходит?
Это зависит от рассматриваемой архитектуры и языка.На практике это обычно означает, что у вас будет условие состязания, а значение «чтение» может быть старым или новым значением.
Более интересно, если два потока пытаются записать в одну и ту же переменную одновременновремя - если один пишет false
, а другой true
, фактическая результирующая переменная может заканчиваться любым значением.
Чтобы гарантировать надлежащий доступ, должен быть установлен барьер памяти.Это особенно верно, если речь идет о нескольких процессорах или даже нескольких ядрах, поскольку строки кэша ЦП должны быть признаны недействительными после записи потока, чтобы отдельный поток мог прочитать значение.Большинство языков поддерживают это в той или иной форме - например, в C # вы можете пометить переменную как volatile , чтобы помочь в этом, но явная синхронизация (т.е. блокировка) обычно все еще требуется.
Кроме того, если переменная запись не является отдельной инструкцией ЦП (т. Е. Используется блокируемая операция или аналогичная), необходимо позаботиться о явной синхронизации доступа для чтения и записи, иначе вы можете (включитьнекоторые архитектуры) получают переменную в третьем неопределенном состоянии.