TB>>Такие команды есть у всех приличных процессоров. В Win32 API есть
TB>>соответствующие функции: InterlockedExchange, InterlockedIncrement и т.д.
Посмотрел описание InterlockedExchange, похоже что она работает вот так:
void * atomic_exchange ( void ** address, void * new_value )
{
lock ( address );
void * return_value = *address;
*address == new_value;
unlock ( address );
return return_value;
}
а мне нужно вот так:
void * atomic_pointer_assignment ( void ** address, void * old_value, void * new_value )
{
lock ( address );
if ( *address == old_value ) // значение не изменено другим потоком
*address = new_value; // значит можно поменять значение указателя
void * return_value = *address;
unlock ( address );
return return_value; // возвращается индикатор успеха/неуспеха операции
}