По этому вопросу меня интересуют только x86 и x86-64.
Для MSVC 2005 документация для __faststorefence гласит: "Гарантирует, что каждый предыдущий магазин будет виден глобально перед любым последующим магазином ."
Для MSVC 2008 и 2010 он изменился на: "Гарантирует, что каждая предыдущая ссылка на память , включая ссылки на загрузку и хранение , будет видна глобально перед любой последующей ссылкой на память . «
То, как написано последнее, на мой взгляд, подразумевает, что это также блокирует переупорядочение загрузки ЦП перед старыми магазинами. Это отличается от первого определения, которое подразумевает, что внутреннее свойство имеет дело только с блокировкой или переупорядочением невременных хранилищ с более старыми хранилищами (единственное другое переупорядочение x86 (-64) делает).
Однако тогда документация, по-видимому, противоречит самой себе: "На платформе x64 эта процедура генерирует инструкцию, которая быстрее store fence , чем инструкция sfence . Используйте эту встроенную функцию вместо _mm_sfence на платформе x64. "
Это подразумевает, что он по-прежнему имеет функциональность, подобную sfence, и, следовательно, нагрузки могут быть переупорядочены в более старых магазинах. Так что это? Может кто-нибудь прояснить мою путаницу?
PS: в поисках GCC-версии этой функции я наткнулся на long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local));
, но я думаю, что это из 32-битного кода; какой будет 64-битный аналог?