Существует ли на уровне команд микропроцессора или ОС команда атомарного присваивания 32-битного значения по заданному адресу? Т.е. команда выполняющая следующую микропрограмму (код приведен на псевдокоде):
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; // возвращается индикатор успеха/неуспеха операции
}
> Существует ли на уровне команд микропроцессора или ОС команда > атомарного присваивания 32-битного значения по заданному адресу? >
Существует: mov!!!
Posted via RSDN NNTP Server 1.9 gamma
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, TheBeard, Вы писали:
TB>Такие команды есть у всех приличных процессоров. В Win32 API есть TB>соответствующие функции: InterlockedExchange, InterlockedIncrement и т.д.
Посмотрите InterlockedCompareExchangeю Если не подойдёт, то, видимо,
придётся использовать критические секции (если синхронизируется доступ
внутри одного процесса; для межпроцессной синхронизации потребуется Mutex).
lock/unlock -> EnterCriticalSection/LeaveCriticalSection в Win32
Алексей. wrote: > > Посмотрел описание InterlockedExchange, похоже что она работает вот так: > [skip] > а мне нужно вот так: > [skip]
Здравствуйте, TheBeard, Вы писали:
TB>Посмотрите InterlockedCompareExchangeю Если не подойдёт, то, видимо, TB>придётся использовать критические секции (если синхронизируется доступ TB>внутри одного процесса; для межпроцессной синхронизации потребуется Mutex).
То что нужно!
Интересно, а InterlockedCompareExchange реализована через специализированную инструкцию процессора или через EnterCriticalSection/LeaveCriticalSection?
TB>lock/unlock -> EnterCriticalSection/LeaveCriticalSection в Win32
Здравствуйте, Алексей., Вы писали:
А>Здравствуйте, TheBeard, Вы писали:
TB>>Посмотрите InterlockedCompareExchangeю Если не подойдёт, то, видимо, TB>>придётся использовать критические секции (если синхронизируется доступ TB>>внутри одного процесса; для межпроцессной синхронизации потребуется Mutex).
А>То что нужно! А>Интересно, а InterlockedCompareExchange реализована через специализированную инструкцию процессора или через EnterCriticalSection/LeaveCriticalSection?