yigal_s: (Default)
[personal profile] yigal_s
внезапно оказалось, что пишу я код под процессор, у которого кроме операции InterlockedExchange ничего интерлоканного и нет. Это, значица, 2-е десятилетие 21го века на дворе, а у нас лошади не сёдланы даже.

Стало мне от этого немного грустно, и вздумалось реализовать все остальные интерлок-операции через эту единственную.

Начал я с InterlockedAdd. Вот такая штука получилась (пишу коряво, лишь чтобы идею передать). Не знаю, заработает ли, но по идее, должно ;-)

LONG InterlockedExchangeAdd(int *pval, int delta)
{
   int cur = *pval;
never_again:
   int result = cur + delta;
   int newVal = InterlockedExchange(pval, result); // aka asm xchg
   if( newVal != cur )
   {
       delta = newVal - cur;
       cur = newVal;
       goto never_again;
   }
   return cur; 
}

Теперь осталось сымплементировать InterlockedComparedExchange, и можно садиться писать диссертацию.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting