Tricky. Я бы сказал, что в теории этот код небезопасен. Если нет никаких барьеров памяти, тогда доступ к данным, который вы защищаете, может быть перемещен через спин-блокировку. Тем не менее, это будет сделано только в том случае, если компилятор будет очень агрессивным и сможет увидеть цель в этом переупорядочении.
Возможно, Intel просто определила, что этот код работает на всех текущих компиляторах, и что даже если компилятор теоретически может выполнять преобразования, которые нарушат этот код, эти преобразования не будут ускорять программу, и так что компиляторы, вероятно, этого не сделают.
Другая возможность состоит в том, что этот код используется только в компиляторах, которые неявно реализуют барьеры памяти при доступе volatile
. Компилятор Microsoft Visual C ++ (2005 и более поздние версии) делает это. Вы проверили, заключено ли это в блок #ifdef
или аналогичный, применяя эту реализацию только к компиляторам, где volatile
использует барьеры памяти?