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