В Win32 IntelockedIncrement / IntelockedIncrement64 и связанные с ним операции компилируются в инструкции x86, которые допускают атомарные операции на уровне процессора для 32- или 64-разрядных слов (в зависимости от вашей архитектуры). Это хорошо работает в случае простого счетчика, но, естественно, не будет работать, если вы пытаетесь синхронизировать большую структуру с несколькими словами.
PS из здесь , соответствующий asm, который вам понадобится для реализации в системе без Win32, работающей на x86.
inline long InterlockedExchangeAdd( long* Addend, long Increment )
{
long ret;
__asm__ (
/* lock for SMP systems */
"lock\n\t"
"xaddl %0,(%1)"
:"=r" (ret)
:"r" (Addend), "0" (Increment)
:"memory" );
return ret;
}
inline long InterlockedIncrement( long* Addend )
{
return InterlockedExchangeAdd( Addend, 1 );
}
inline long InterlockedDecrement( long* Addend )
{
return InterlockedExchangeAdd( Addend, -1 );
}