2013-08-28 4 views
1

Насколько я знаю, компилятор (программное обеспечение) и процессор (аппаратное обеспечение) будут изменять порядок по причине производительности, и устройства памяти могут предотвратить переупорядочение, они находятся на уровне компилятора или на уровне процессора.Действительно ли boost :: atomic действует как барьер аппаратной памяти?

MSDN говорит: «Функция Interlockedxxxx генерирует полный барьер памяти (или забор), чтобы гарантировать, что операции с памятью завершены в порядке», я не знаю, что «полный барьер памяти» означает аппаратный или программный барьер?

Что сделано boost :: atomic? аппаратный барьер? очистить кеш процессора/буфер хранения?

Семантика памяти_order_acquire делает программную или аппаратную машину?

+0

use std :: atomic – James

+0

Вы используете «аппаратный барьер» для обозначения «инструкций/префикса процессора» и «программного барьера», что означает «влияет на оптимизацию компилятора»? –

ответ

2

Он предоставляет указанную модель памяти, используя любые барьеры, необходимые для используемой платформы.

Помните, что boost::atomic - это портативный API с реализациями на разных платформах. С другой стороны, API-интерфейсы Windows работают только на Intel. В результате документация MSDN будет содержать информацию о платформе (потому что есть только три платформы - x86, x64, Itanium), а документы atomic не будут.

(NB: Большая часть Win32 также используется в Windows CE на процессорах ARM, но имеется параллельный набор страниц документации. еще один набор документов.)

+0

Итак, это гарантия boost :: atomic (или std :: atomic)? – amanjiang

+0

@amanjiang: 'boost :: atomic' предоставляет модель памяти, описанную в документах' Boost', а 'std :: atomic' предоставляет модель памяти, описанную в стандарте C++. –

2

Что делается по boost::atomic? аппаратный барьер? очистить кеш процессора/буфер хранения?

Имеет ли это значение?

Атомные операции устанавливают отношения синхронизации. Они делают все, что нужно сделать на целевой машине, чтобы достичь поведения, определенного этими отношениями.

Например, операции с семантикой хранилища хранилища синхронизировать с операциями с семантикой загрузки. Если операция A синхронизирует с операцию B, то говорится, что межпоточная связь A происходит до B, и это означает, что A происходит до B, а это означает, что A и B не вызывают данные гонки. (Имена отношений синхронизации отмечены с акцентом)

0

При изменении значений, разделяемых между потоками, возникают три проблемы. Во-первых, есть возможность переключения потока в середине чтения или записи значения, в результате чего в каком-то другом потоке можно увидеть частично написанное (т. Е. Бессмысленное) значение. Во-вторых, каждый процессор имеет свой собственный кеш данных, поэтому записи из одного потока на одном процессоре могут быть недоступны для другого потока, работающего на другом процессоре. В-третьих, компилятор может изменить порядок инструкций в пределах пределов, чтобы сделать код более эффективным. std::atomic устраняет все три возможности: чтение и запись атомных объектов выполняются без перерыва; запись в атомный тип сбрасывает кеш в основную память, а чтение из атомного типа перезагружает кеш из основной памяти; и компилятору не разрешается перемещать инструкции по операциям с атомарными типами. Подробности о том, как эти вещи выполняются (в том числе, нужно ли что-либо сделать), зависят от целевой платформы, но все это делается в реализации стандартной библиотеки. EDIT: кричит, только заметил, что вопрос спрашивает о Boost.Я не вникнул в это, но я полагаю, что Boost удовлетворяет тем же ограничениям, что и стандартная библиотека, и соответствующим образом реализует эти ограничения.

+0

std :: atomic будет генерировать как CPU, так и компилятор, если необходимо, чтобы убедиться, что он всегда работает, правильно ли я понимаю? – amanjiang

+0

@amanjiang - это правильно. –