Lo que (si existe) es el equivalente de C# del comando ASM "XCHG".¿Cómo cambio atómicamente 2 ints en C#?
Con ese comando, que es un intercambio genuino (a diferencia de Interlocked.Exchange), podría simplemente cambiar atómicamente dos ints, que es lo que realmente estoy tratando de hacer.
Actualización:
Código de ejemplo basado en mi sugerencia. Variable con el sufijo "_V" están decoradas tan volátil:
// 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<IPC.Producer>(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;
Nota del perezoso actualización.
Por favor, actualice su pregunta con los detalles adicionales que ha proporcionado en los comentarios a mi respuesta. Ayudará a otros a tratar de responder a su pregunta si conocen todas las restricciones. http://stackoverflow.com/questions/3855671/how-do-i-atomically-swap-2-ints-in-c/3855700#3855700 –
La instrucción XCHG no sería la operación atómica que está buscando ya que no es el código de operación 'XCHG [mem1], [mem2]'. Necesitarías tres instrucciones: 'mov reg, [mem1] XCHG reg, [mem2] mov [mem1], reg' – Skizz
@Skizz He echado otro vistazo al manual de ASM: tienes razón. Guau. Incluso en ensamblador uno no puede hacer lo que estoy buscando. – IamIC