Есть ли компиляторы C или C++, которые реализуют «агрессивную» модель согласованности памяти для переменных volatile
? Под «агрессивной» моделью согласованности я подразумеваю сопровождение всех записей в переменные volatile
с барьерами памяти в сгенерированном коде.Компиляторы C и C++ с «агрессивной» летучей семантикой
AFAIK, это обычное поведение для компиляторов C или C++ на платформе IA64 (Itanium). Что относительно x86? Есть ли там компилятор, который реализует (или может быть настроен для реализации) подход, подобный Itanium, к обработке переменных volatile
на платформе x86?
Edit: Я смотрю на код VS 2005 генерирует (после прочтения комментариев), и я не вижу ничего, что будет напоминать какой-либо барьер памяти при доступе к volatile
переменных. Это идеально подходит для обеспечения согласованности памяти на однопроцессорной многоядерной платформе x86 из-за протоколов кеширования MESIF (Intel) и MOESI (AMD).
Однако этого недостаточно для многопроцессорной платформы SMP x86. Для обеспечения согласованности памяти между ЦП платформа SMP потребует ограничений памяти в сгенерированном коде. Что мне не хватает? Что означает Microsoft, когда утверждают, что они уже имеют семантику получения-выпуска в переменных volatile
?
[Согласно Raymond Chen] (https://blogs.msdn.com/b/oldnewthing/archive/2011/04/19/10155452.aspx?Redirected=true), вы получите это поведение с VS2005 и новее – Praetorian
@ Prætorian: [Согласно официальной документации] (http://msdn.microsoft.com/en-us/library/12a04hfd.aspx). ; -] – ildjarn
@AndreyT: Вы тестируете VC++ 2005 или VC++ 2005 SP1? У IIRC, VC++ 2005 RTM была ошибка, в которой 'volatile' не имела ожидаемой семантики, которая была исправлена в SP1 и VC++ 2008+. – ildjarn