Насколько я знаю, компилятор (программное обеспечение) и процессор (аппаратное обеспечение) будут переупорядочивать инструкции
по соображениям производительности,
и носители памяти могут предотвратить переупорядочение,
они находятся на уровне компилятора или на уровне процессора.
В MSDN говорится: «Функция Interlockedxxxx создает полный барьер памяти (или забор) для обеспечения того, чтобы операции с памятью выполнялись по порядку», я не знаю, «полный барьер памяти» означает аппаратный или программный барьер?
Что делает boost :: atomic? аппаратный барьер? очистить кэш процессора / буфер?
Семантика memory_order_acquire делает программный или аппаратный носитель?
Он обеспечивает указанную модель памяти, используя любые барьеры, необходимые для платформы, которую вы используете.
Помни что boost::atomic
является переносимым API с реализациями на многих различных платформах. С другой стороны, API-интерфейсы Windows для настольных компьютеров работают только на Intel. В результате документация MSDN будет содержать информацию о платформе (поскольку имеется только три платформы — x86, x64, Itanium) и atomic
документы не будут.
(Примечание: большая часть Win32 также используется в Windows CE на процессорах ARM, но есть параллельный набор страниц документации. Страницы рабочего стола не охватывают ARM. А API-интерфейсы «Магазина Windows», которые охватывают Windows 8 RT, являются еще одним набором Docs.)
Что сделано
boost::atomic
? аппаратный барьер? очистить кэш процессора / буфер?
Это имеет значение?
Атомарные операции устанавливают отношения синхронизации. Они делают все, что нужно сделать на целевой машине, чтобы добиться поведения, определенного этими отношениями.
Например, операции с семантикой релиз-магазин синхронизировать с операции с семантикой загрузки-получения. Если операция А синхронизируется с операция B, то говорят, что A меж-поток происходит раньше B, и это означает, что A происходит раньше B, и это означает, что A и B не вызывают гонки данных. (Названия отношений синхронизации выделены выделением)
Есть три проблемы, связанные с изменением значений, которые разделяются между потоками. Во-первых, существует возможность переключения потока в середине чтения или записи значения, в результате чего другой поток может увидеть частично записанное (т.е. бессмысленное) значение. Во-вторых, каждый процессор имеет свой собственный кэш данных, поэтому записи из одного потока на одном процессоре могут быть не видны другому потоку, работающему на другом процессоре. В-третьих, компилятор может изменить порядок команд в определенных пределах, чтобы сделать код более эффективным. std::atomic
исключает все три возможности: чтение и запись атомных объектов выполняются без перерыва; запись в атомарный тип сбрасывает кэш в основную память, а чтение из атомарного типа перезагружает кэш из основной памяти; и компилятору не разрешено перемещать инструкции между операциями над атомарными типами. Детали того, как эти вещи выполняются (включая необходимость выполнения каких-либо действий), зависят от целевой платформы, но все это делается в реализации стандартной библиотеки. РЕДАКТИРОВАТЬ: к сожалению, только что заметил, что вопрос о Boost. Я не копался в этом, но я предполагаю, что Boost удовлетворяет тем же ограничениям, что и стандартная библиотека, и соответствующим образом реализует эти ограничения.