2009-05-28 6 views

Respuesta

10

Hay Interlocked.Exchange. Esto lo hace en una llamada atómica segura para hilos.


Edición después de comentarios:

Solo para aclarar cómo funciona esto utilizando Interlocked.Exchange, que haría:

left = Interlocked.Exchange(ref right, left); 

Este será el equivalente (en efecto) a hacer:

Swap(ref left, ref right); 

Sin embargo, Interlocked.Exchange lo hace como una operación atómica, por lo que es seguro para la rosca.

+1

Interlocked.Exchange establece un valor, en realidad no intercambia valores. Aún necesitaría guardar una temperatura y llamar a Interlocked.Exchange dos veces para que no gane nada. – jrista

+1

Interlocked.Exchange no es realmente equivalente al Swap especificado. Solo cambia el primer valor y no toca el segundo (sí mismo). –

+1

@Mehdrad: left = InterlockedExchange (ref derecha, izquierda); –

3

No, el framework no tiene dicho método. Probablemente la razón es que no hay mucho beneficio para tenerlo incorporado y podrías agregarlo fácilmente (como lo hiciste). Esto también requiere el uso de ref como parámetro, lo que limitará en gran medida los casos de uso. Por ejemplo, no podría hacer esto:

List<int> test; 
// ... 
Swap(ref test[0], ref test[1]); // won't work, it's an indexer, not an array 
Cuestiones relacionadas