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 лет не тупил.