Подтвердить что ты не робот

C и С++ с "агрессивной" изменчивой семантикой

Существуют ли компиляторы C или С++, которые реализуют "агрессивную" модель согласованности памяти для переменных volatile? Под "агрессивной" моделью согласованности я подразумеваю, что все записи записываются в переменные volatile с барьерами памяти в сгенерированном коде.

AFAIK, это обычное поведение для компиляторов C или С++ на платформе IA64 (Itanium). Что относительно x86? Есть ли там компилятор, который реализует (или может быть настроен для реализации) подход, подобный Itanium, к обработке переменных volatile на платформе x86?

Изменить: Я смотрю на код, который VS 2005 генерирует (после прочтения комментариев), и я не вижу ничего, что могло бы напоминать какой-либо барьер памяти при доступе к переменным volatile. Это идеально подходит для обеспечения согласованности памяти на однопроцессорной многоядерной платформе x86 из-за протоколов кэширования MESIF (Intel) и MOESI (AMD).

Однако этого недостаточно для многопроцессорной платформы SMP x86. Для обеспечения согласованности памяти между ЦП платформа SMP потребует ограничений памяти в сгенерированном коде. Что мне не хватает? Что означает Microsoft, когда утверждают, что у них уже есть семантика get-release на переменных volatile?

4b9b3361

Ответ 1

Следует отметить, что процессоры x86 не изменяют ни нагрузки с другими нагрузками, ни магазины с другими магазинами. Таким образом, нет явных препятствий.

Компилятор MSVC гарантирует, что нагрузки не переупорядочиваются с изменчивыми нагрузками, а магазины не переупорядочиваются с помощью энергозависимых хранилищ (теперь я говорю о переупорядочении инструкций по загрузке и хранению), что гарантирует семантику получения и выпуска для летучих нагрузок и сохраняет соответственно.