Неатомарная на Си(логика работы):
Код
LONG InterlockedExchangeAdd(LONG volatile *dest, LONG incr)
{
LONG res = (*dest);
(*dest) += incr;
return res;
}
{
LONG res = (*dest);
(*dest) += incr;
return res;
}
Атомарная под x86(для linux):
Код
static inline LONG InterlockedExchangeAdd (LONG volatile * dest, LONG incr)
{
int ret;
__asm __volatile__(
"lock\n\t"\
"xaddl %0,(%1)"
: "=r" (ret)
: "r" (dest), "0" (incr)
: "memory"
);
return ret;
}
{
int ret;
__asm __volatile__(
"lock\n\t"\
"xaddl %0,(%1)"
: "=r" (ret)
: "r" (dest), "0" (incr)
: "memory"
);
return ret;
}