2010-06-23 5 views
1

Salut les gars J'améliore ma connaissance du multithreading C# et je me demandais comment résoudre ce problème d'interblocage classique.Deadlocks C# Solution

public class SomeClass 
{ 
    private object _lock1 = new object(); 
    private object _lock2 = new object(); 


    public void Method1() 
    { 
     lock (_lock1) 
     { 
      Thread.Sleep(10000); 
      lock (_lock2) 
      { 
       Thread.Sleep(10000); 
      } 
     } 
    } 

    public void Method2() 
    { 
     lock (_lock2) 
     { 
      Thread.Sleep(10000); 
      lock (_lock1) 
      { 
       Thread.Sleep(10000); 
      } 
     } 
    } 
} 

Si deux threads s'exécutent simultanément, il existe un risque d'interblocage.

Merci

+5

Vous le résolvez en n'écrivant jamais de telles choses. Si vous avez une situation qui doit absolument le faire pour une raison idiote et qui ne peut pas être reconfigurée, les threads devraient essayer le verrou externe et s'ils ne peuvent pas le prendre immédiatement, faites d'autres choses et revenez et essayez à nouveau le verrou. –

+0

Peut-être que l'article * No More Hangs: Techniques avancées pour éviter et détecter les blocages dans les applications .NET * sur [MSDN] (http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7- 9e6d-3aa95b5a6aea/MSDNMagazineApril2006en-us.chm) peut vous aider. – Oliver

Répondre

2
  • Prenez vos serrures dans un ordre cohérent
  • Gardez vos serrures granuleuse que possible
  • Évitez les verrous lorsque cela est possible en utilisant des structures de données immuables
  • Utilisation Monitor.TryEnter au lieu de verrouillage (qui ne temporise pas)
2

Ceci n'est pas un problème C# il est plus général. Votre exemple n'est évidemment pas correct. Essayez d'éviter l'imbrication de verrouillage est le modèle commun si vous vous retrouvez dans une impasse. Il un bon livre sur la synchronisation: http://greenteapress.com/semaphores/

+0

Merci pour vos réponses, je vais jeter un oeil à ce livre. –

0

Vous devez toujours prendre les verrous dans le même ordre: d'abord verrouiller un, puis verrouiller deux et ainsi de suite. Vous n'avez pas besoin de toujours prendre tous les verrous: par exemple, method1() prend lock1 et lock2, et method2() ne prend que lock2, cela ne provoquera pas de blocage.

+0

Pourriez-vous ajouter un exemple de code à votre réponse, pour exprimer votre réponse dans le contexte où la question a été posée. Un exemple concret est très utile. –