Я не могу найти реализацию AtomicCmpExchange
(кажется, скрытой), поэтому я не знаю, что он делает.
Является AtomicCmpExchange
надежным на всех платформах? Как это внедряется внутри страны? Использует ли он что-то вроде критической секции?
У меня такой сценарий:
MainThread:
Target := 1;
Резьба1:
x := AtomicCmpExchange(Target, 0, 0);
Резьба2:
Target := 2;
Thread3:
Target := 3;
Будет ли x
всегда быть целым числом 1, 2 или 3, или это может быть что-то еще? Я имею в виду, даже если AtomicCmpExchange(Target, 0, 0)
не удалось обменять значение, возвращает ли оно "действительное" целое число (я имею в виду не целое число с половинным чтением, например, если другой поток уже начал писать половину значения)?
Я хочу избежать использования критического раздела, мне нужна максимальная скорость.