Interlocked функции для Int64 и WinXP

В детстве меня покусал Джеф Рихтер, поэтому я свято верил в то, что Interlocked-функции экспортируются системной DLL-ю.

В сгенерированный машинный код для вызова этих функций я не заглядывал.

Как следствие, я считал что версии для 64-битных чисел на старой WinXP не поддерживаются и использовать их нельзя…

Этому способствовало и описание этих функций. Например, InterlockedExchange64:

Minimum supported client Windows Vista [desktop apps | UWP apps]
Minimum supported server Windows Server 2003 [desktop apps | UWP apps]
Target Platform Windows

А тут внезапно обнаружилось, что эти функции (по большому счету) не экспортируются, а встраиваются в точку вызова.

Это радикально все меняет!

        return static_cast<_Ty>(_InterlockedIncrement64(_Atomic_address_as<long long>(this->_Storage)));
000000013F40ABC2  mov         rcx,qword ptr [this]  
000000013F40ABC9  call        std::_Atomic_address_as<__int64,std::_Atomic_padded<unsigned __int64> > (013F3FA5CCh)  
000000013F40ABCE  nop  
000000013F40ABCF  mov         ecx,1  
000000013F40ABD4  lock xadd   qword ptr [rax],rcx  
000000013F40ABD9  inc         rcx  
000000013F40ABDC  mov         rax,rcx  

Приведенный код нормально отрабатывает на 32-битной XP SP2.

Написал бы Рихтер про это в своем третьем издании «Win для Pro» — я бы 20 лет не тупил.

Leave a Comment