Lo struct SpinLock
permette di mettere in pausa un Thread in caso di accesso a risorse condivise utilizzando lo spinning, quindi facendogli fare del lavoro inutile in loop.
Viene utilizzato negli stessi casi del costrutto lock
(anche se in questo caso non ho la sintassi comoda), quindi quando voglio evitare un accesso contemporaneo alla stessa risorsa.
var spinLock = new SpinLock(true);
var lockTaken = false;
try
{
// lockTaken rimane a false dopo aver chiamato Enter se e solo se
// il metodo Enter lancia una Eccezione e il lock non era stato ancora preso da nessuno
spinLock.Enter(ref lockTaken);
// Accesso a risorse critiche...
}
finally
{
// Esco dallo SpinLock se lo ho preso
if (lockTaken)
spinLock.Exit();
}