Что (если есть) является эквивалентом C # x86 asm xchg
инструкция?
С помощью этой команды, которая, как мне кажется, является подлинным обменом (в отличие от Interlocked.Exchange
), я мог бы просто атомарно поменять местами два целых числа, что я и пытаюсь сделать.
Обновление:
Пример кода на основе моего предложения. Переменные с суффиксом "_V" оформлены как изменчивые:
// PART 3 - process links
// prepare the new Producer
address.ProducerNew.WorkMask_V = 0;
// copy the current LinkMask
address.ProducerNew.LinkMask_V = address.Producer.LinkMask_V;
// has another (any) thread indicated it dropped its message link from this thread?
if (this.routerEmptyMask[address.ID] != 0)
{
// allow all other bits to remain on (i.e. turn off now defunct links)
address.ProducerNew.LinkMask_V &= ~this.routerEmptyMask[address.ID];
// reset
this.routerEmptyMask[address.ID] = 0;
}
// PART 4 - swap
address.ProducerNew = Interlocked.Exchange(ref address.Producer, address.ProducerNew);
// PART 5 - lazily include the new links, make a working copy
workMask = address.Producer.LinkMask_V |= address.ProducerNew.WorkMask_V;
Обратите внимание на ленивое обновление.