Что касается порядка, который я опишу ниже, у меня есть несколько связанных вопросов.
Учитывая эти гарантии упорядочения, мне не нужны явные заборы во многих местах. Однако, как я могу выразить «забор» компилятору, в частности GCC? То есть гарантия заказа программы действует только при условии, что оптимизатор не меняет порядок моей программы.
Существуют ли распространенные / популярные новые чипы с ядрами общего назначения, которые не дают таких гарантий?
Я немного запутался в C ++ 0x с его идеей чередования. Должен ли я использовать «атомарный» класс, чтобы использовать эти гарантии, или в проекте есть какой-то другой аспект, который также предоставляет способ использовать эти гарантии?
Порядок в памяти
И Intel, и AMD, по крайней мере с x86_64, гарантируют, что загрузка памяти будет последовательной по отношению к операциям хранения, выполняемым на одном процессоре. То есть, если какой-то процессор выполняет эти хранилища:
- Магазин A <- 1 </li>
- Магазин B <- 2 </li>
- Магазин C <- 3 </li>
В тот момент, когда какой-то другой процессор видит C (3), он гарантированно также видит предыдущие хранилища A (1) и B (2). Теперь видимость между процессорами может чередоваться, но порядок сохранения от любого данного процессора также будет последовательным.
Они также имеют транзитивные гарантии, когда Процессор 0 считывает значение, сохраненное Процессором 1, а затем записывает значение, что Процессор 2, читающий новое значение, должен также видеть это значение из Процессора 1.
Игнорировать особые случаи, связанные с IO и специальными устройствами. Меня интересуют только общие гарантии памяти: мой порядок здесь как раз тот, который меня больше всего интересует, поскольку он имеет наибольшее значение для параллельных алгоритмов.