yigal_s: (Default)
yigal_s ([personal profile] yigal_s) wrote2010-10-09 03:46 am
Entry tags:

мультитред: интерлоки на дровах

внезапно оказалось, что пишу я код под процессор, у которого кроме операции 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, и можно садиться писать диссертацию.

Post a comment in response:

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