2012-11-22 3 views
6

J'apprends multi-threading en C# et j'ai vu un code ci-dessousNested verrouillage en C#

static readonly object _locker = new object(); 

static void Main() 
{ 
    lock (_locker) 
    { 
    AnotherMethod(); 
    // ...some work is going on 
    } 
} 

static void AnotherMethod() 
{ 
    lock (_locker) { Console.WriteLine ("Another method"); } 
} 

Je me demande quand est-il besoin d'utiliser le verrouillage imbriqué? Pourquoi n'utilisez-vous pas une seule serrure dans ce cas?

+0

si 'AnotherMethod' est utilisé ailleurs aussi (et non seulement dans' Main') ... – Yahia

+1

Le code est vraiment redondant. Le verrou extérieur (_locker) n'est pas nécessaire. Sauf si AnotherMethod() est public et utilisé depuis un autre endroit. – Matthias

Répondre

4

Ma première réponse serait que AnotherMethod peut être appelée directement, sans passer par la méthode Main, donc vous aurez besoin d'un verrouillage imbriqué.

1

Pour autoriser le code re-entrant.

Votre exemple n'est pas approprié. Les verrous sont utilisés pour fournir un accès contrôlé à critical section.

Si une section critique invoque une autre section critique, un interblocage se produit. Pour éviter cela, le code entrant est autorisé.

Why do nested locks not cause a deadlock?

+0

Je ne comprends pas la conception du code re-entrant. Mon code est aussi re-entrant comme ici http://stackoverflow.com/questions/391913/re-entrant-locks-in-c-sharp. Quand est-ce que ça va être utilisé? – Alexandre

+0

http://en.wikipedia.org/wiki/Reentrancy_(computing) – Tilak