Атомарное присваивание указателю
От: Алексей.  
Дата: 27.10.04 16:34
Оценка:
Существует ли на уровне команд микропроцессора или ОС команда атомарного присваивания 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; // возвращается индикатор успеха/неуспеха операции
}
Re: Атомарное присваивание указателю
От: TheBeard Россия  
Дата: 27.10.04 16:52
Оценка:
Такие команды есть у всех приличных процессоров. В Win32 API есть
соответствующие функции: InterlockedExchange, InterlockedIncrement и т.д.

Алексей. wrote:

> Существует ли на уровне команд микропроцессора или ОС команда

> атомарного присваивания 32-битного значения по заданному адресу?
Posted via RSDN NNTP Server 1.9 gamma
Re: Атомарное присваивание указателю
От: Stanky  
Дата: 27.10.04 16:59
Оценка:
> Существует ли на уровне команд микропроцессора или ОС команда
> атомарного присваивания 32-битного значения по заданному адресу?
>
Существует: mov!!!
Posted via RSDN NNTP Server 1.9 gamma
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[2]: Атомарное присваивание указателю
От: Алексей.  
Дата: 27.10.04 17:01
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>Такие команды есть у всех приличных процессоров. В Win32 API есть

TB>соответствующие функции: InterlockedExchange, InterlockedIncrement и т.д.

Спасибо за наводку!
Re[3]: Атомарное присваивание указателю
От: Алексей.  
Дата: 27.10.04 17:32
Оценка:
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; // возвращается индикатор успеха/неуспеха операции
}
Re: Атомарное присваивание указателю
От: bokl  
Дата: 27.10.04 17:41
Оценка:
CMPXCHG
... << RSDN@Home 1.1.3 stable >>
Re[4]: Атомарное присваивание указателю
От: TheBeard Россия  
Дата: 27.10.04 17:42
Оценка:
Посмотрите InterlockedCompareExchangeю Если не подойдёт, то, видимо,
придётся использовать критические секции (если синхронизируется доступ
внутри одного процесса; для межпроцессной синхронизации потребуется Mutex).

lock/unlock -> EnterCriticalSection/LeaveCriticalSection в Win32

Алексей. wrote:
>
> Посмотрел описание InterlockedExchange, похоже что она работает вот так:
> [skip]
> а мне нужно вот так:
> [skip]
Posted via RSDN NNTP Server 1.9 gamma
Re[5]: Атомарное присваивание указателю
От: Алексей.  
Дата: 27.10.04 18:00
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>Посмотрите InterlockedCompareExchangeю Если не подойдёт, то, видимо,

TB>придётся использовать критические секции (если синхронизируется доступ
TB>внутри одного процесса; для межпроцессной синхронизации потребуется Mutex).

То что нужно!
Интересно, а InterlockedCompareExchange реализована через специализированную инструкцию процессора или через EnterCriticalSection/LeaveCriticalSection?

TB>lock/unlock -> EnterCriticalSection/LeaveCriticalSection в Win32


Вот этого как раз и хочется избежать.
Re[2]: Атомарное присваивание указателю
От: Алексей.  
Дата: 27.10.04 18:05
Оценка:
Здравствуйте, bokl, Вы писали:


B>CMPXCHG


Она самая! Спасибо!
Re[6]: Атомарное присваивание указателю
От: bokl  
Дата: 27.10.04 18:44
Оценка:
Здравствуйте, Алексей., Вы писали:

А>Здравствуйте, TheBeard, Вы писали:


TB>>Посмотрите InterlockedCompareExchangeю Если не подойдёт, то, видимо,

TB>>придётся использовать критические секции (если синхронизируется доступ
TB>>внутри одного процесса; для межпроцессной синхронизации потребуется Mutex).

А>То что нужно!

А>Интересно, а InterlockedCompareExchange реализована через специализированную инструкцию процессора или через EnterCriticalSection/LeaveCriticalSection?

Смотрим в kernel32.dll:

.text:7C57B5BC InterlockedCompareExchange proc near ; CODE XREF: sub_7C59933E+A5
.text:7C57B5BC
.text:7C57B5BC Destination = dword ptr 4
.text:7C57B5BC Exchange = dword ptr 8
.text:7C57B5BC Comperand = dword ptr 0Ch
.text:7C57B5BC
.text:7C57B5BC mov ecx, [esp+Destination]
.text:7C57B5C0 mov edx, [esp+Exchange]
.text:7C57B5C4 mov eax, [esp+Comperand]
.text:7C57B5C8
.text:7C57B5C8 loc_7C57B5C8: ; DATA XREF: .data:7C5CA008
.text:7C57B5C8 lock cmpxchg [ecx], edx
.text:7C57B5CC retn 0Ch
.text:7C57B5CC InterlockedCompareExchange endp
... << RSDN@Home 1.1.3 stable >>
Re[3]: Атомарное присваивание указателю
От: TarasCo  
Дата: 28.10.04 07:02
Оценка:
Здравствуйте, Алексей., Вы писали:

А>Здравствуйте, bokl, Вы писали:



B>>CMPXCHG


А>Она самая! Спасибо!


ТОлько не забудте префикс lock
Да пребудет с тобою сила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.