Какой правильный способ атомарного обмена двумя беззнаковыми 32-битными переменными (ULONG)?

Я нашел функцию InterlockedExchange, которая позволяет мне обмениваться двумя знаковыми 32-битными переменными (LONG).

Но как правильно атомно обмениваться двумя беззнаковыми 32-битными переменными (ULONG) под Windows?

Я не вижу очевидного способа сделать это, используя функции, предоставляемые Microsoft.

(Учитывая, что Microsoft также сообщает мне, что результат преобразования целых чисел без знака в целые числа со знаком в некоторых случаях определяется реализацией.)

2 ответа

Решение

Просто используйте приведение типа:

ULONG value1, value2;
InterlockedExchange((LPLONG)&value2, (LONG)value1);

В вашей ссылке приведение чего-либо без знака к типам разных размеров
(и / или материал с плавающей точкой) объясняется.
Приведение только между подписанным и неподписанным того же типа
должно быть возможно без проблем.

Другие вопросы по тегам