Общеизвестно, что современные архитектуры процессоров используют оптимизацию производительности, что может привести к нарушению порядка выполнения. В однопоточных приложениях может также произойти переупорядочение памяти, но оно не должно быть понятным для программистов, как если бы память была доступна в программном порядке. И для SMP, барьеры памяти приходят на помощь, которые используются для обеспечения некоторого порядка упорядочивания памяти.
Что я не уверен, речь идет о многопоточности в однопроцессорном режиме. Рассмотрим следующий пример: Когда выполняется поток 1, хранилище до f
может иметь место до хранения до x
. Пусть, скажем, контекстный переключатель происходит после записи f
и прямо перед x
. Теперь поток 2 запускается, и он завершает цикл и печатает 0, что нежелательно, конечно.
// Both x, f are initialized w/ 0.
// Thread 1
x = 42;
f = 1;
// Thread 2
while (f == 0)
;
print x;
Возможно ли описанный выше сценарий? Или есть гарантия того, что физическая память будет зафиксирована во время переключения контекста потока?
В соответствии с этим wiki,
Когда программа запускается на однопроцессорной машине, аппаратное обеспечение выполняет необходимую бухгалтерию, чтобы программа выполнялась так, как будто все операции памяти выполнялись в порядке, программист (порядок программы), поэтому блокировки памяти не нужны.
Хотя в нем явно не упоминалось однопроцессорное многопоточное приложение, оно включает этот случай.
Я не уверен, что это правильно/закончено или нет. Обратите внимание, что это может сильно зависеть от аппаратного обеспечения (модель слабой/сильной памяти). Поэтому вы можете включить оборудование, которое вы знаете в ответах. Спасибо.
PS. устройства ввода/вывода и т.д. здесь меня не беспокоит. И это одноядерный однопроцессор.
Изменить. Спасибо Nitsan за напоминание. Мы не предполагаем, что здесь нет переупорядочения компилятора (только переупорядочение аппаратного обеспечения), а цикл в потоке 2 не оптимизирован. Again, devil находится в деталях.