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