Какой правильный способ атомарного обмена двумя беззнаковыми 32-битными переменными (ULONG)?
Я нашел функцию InterlockedExchange, которая позволяет мне обмениваться двумя знаковыми 32-битными переменными (LONG).
Но как правильно атомно обмениваться двумя беззнаковыми 32-битными переменными (ULONG) под Windows?
Я не вижу очевидного способа сделать это, используя функции, предоставляемые Microsoft.
(Учитывая, что Microsoft также сообщает мне, что результат преобразования целых чисел без знака в целые числа со знаком в некоторых случаях определяется реализацией.)
2 ответа
Решение
Просто используйте приведение типа:
ULONG value1, value2;
InterlockedExchange((LPLONG)&value2, (LONG)value1);
В вашей ссылке приведение чего-либо без знака к типам разных размеров
(и / или материал с плавающей точкой) объясняется.
Приведение только между подписанным и неподписанным того же типа
должно быть возможно без проблем.