Que fait une instruction lock en coulisses ?

Que fait une instruction lock en coulisses ?

L’instruction lock est traduite par C# 3.0 en ceci :

var temp = obj;

Monitor.Enter(temp);

try
{
    // body
}
finally
{
    Monitor.Exit(temp);
}

En C# 4.0, cela a change et c’est maintenant genere comme suit :

bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    // body
}
finally
{
    if (lockWasTaken)
    {
        Monitor.Exit(temp);
    }
}

Vous pouvez trouver plus d’informations sur ce que fait Monitor.Enter ici. Pour citer MSDN :

Utilisez Enter pour acquerir le Monitor sur l’objet passe en parametre. Si un autre thread a execute un Enter sur l’objet mais n’a pas encore execute le Exit correspondant, le thread actuel se bloquera jusqu’a ce que l’autre thread libere l’objet. Il est legal pour le meme thread d’invoquer Enter plus d’une fois sans se bloquer ; cependant, un nombre egal d’appels a Exit doit etre invoque avant que les autres threads en attente sur l’objet ne soient debloques.

La methode Monitor.Enter attendra indefiniment ; elle n’expirera pas.