Часто современные архитектуры ЦП используют оптимизацию производительности, которая может привести к неупорядоченному выполнению. В однопоточных приложениях также может происходить переупорядочение памяти, но оно невидимо для программистов, как если бы доступ к памяти осуществлялся в программном порядке. А для 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;
Возможен ли описанный выше сценарий? Или есть гарантия, что физическая память будет зафиксирована во время переключения контекста потока?
Согласно этой вики,
Когда программа выполняется на однопроцессорной машине, оборудование выполняет необходимый учет, чтобы гарантировать, что программа выполняется так, как если бы все операции с памятью выполнялись в порядке, указанном программистом (порядок выполнения программы), поэтому барьеры памяти не нужны.
Хотя в нем явно не упоминаются однопроцессорные многопоточные приложения, он включает этот случай.
Я не уверен, что это правильно / полно или нет. Обратите внимание, что это может сильно зависеть от оборудования (слабая / сильная модель памяти). Так что вы можете указать в ответах оборудование, которое вы знаете. Спасибо.
PS. ввод-вывод устройства и т. д. меня здесь не касается. И это одноядерный однопроцессор.
Редактировать: Спасибо Nitsan за напоминание, мы предполагаем, что здесь не будет переупорядочивания компилятора (просто переупорядочение оборудования), и цикл в потоке 2 не оптимизирован ... Опять же, дьявол кроется в деталях.
f
изменчивым, чтобы условие цикла не было оптимизировано;) Теперь проблема (вопрос, на котором я хочу сосредоточиться) все еще существует, верно? - person Eric Z   schedule 09.01.2013atomic<int>
(илиatomic_int
) вместоvolatile int
для межпотоковой связи в модели памяти C ++ 11 (и C11). См. Атомарную и изменчивую модель памяти C ++ 11, Является ли volatile int в C таким же хорошим, как std :: atomic ‹int› в C ++ 0x?, Почему std :: atomic перегружает каждый метод квалификатором volatile? и т. Д. - person yohjp   schedule 10.01.2013