11
votes

Échantillon d'impression dans .NET?

Quelqu'un peut-il donner un code d'échantillon de blocage simple en C #? Et veuillez dire le moyen le plus simple de trouver une impasse dans votre échantillon de code C #. (Peut être l'outil qui détectera la serrure morte dans le code d'échantillon donné.)

Remarque: j'ai vs 2008


2 commentaires

@Dotnetbeginner: il n'y a pas de telle chose que c # .net.


Merci beaucoup pour me corriger: D


5 Réponses :


18
votes

Un moyen courant est si vous avez des blocages imbriqués qui ne sont pas acquis dans le même ordre. Le fil 1 pourrait acquérir la serrure A et le thread 2 pourrait acquérir le verrou B et ils iraient une impasse. XXX

EDIT: Exemple de non-verrouillage .. Utilisation de Waritandles. Supposons que Socrate et Descartes ont des steaks et ils sont tous les deux des philosophes bien élevés, nécessitent une fourchette et un couteau pour manger. Cependant, ils n'ont qu'un ensemble d'argenterie, il est donc possible que chacun soit pour chacun d'attraper un ustensile puis attendez-vous à jamais pour l'autre pour remettre leur ustensile.

Voir le Problème de philosophe de salle à manger xxx


3 commentaires

TOUT EXEMPLE EM / O Utilisation de verrouillage (s)?


Qu'en est-il de la détection de verrouillage mort lorsque j'exécute votre exemple de code?


Comment une morte verrouille-t-elle être réalisée sans serrure?



1
votes

Pour le code d'échantillon d'impression, essayez d'utiliser verrouillage (this) dans votre classe pour simuler le scénario d'impression. Checkout Cet exemple .

Suivre deux articles de lecture dignes de lecture détecte l'impasse au moment de l'exécution et discute des moyens de les éviter.

  1. moniteur deadlock par Stephen Toub.
  2. Timedlock à nouveau par Ian Griffiths. < / li>

0 commentaires

1
votes

Il y a un moyen de plus pour obtenir une impasse dans C #. Puisque .NET 2.0 SP1 Nombre de fils dans la piscine sont limités à 250 (à partir de 25 dans la version précédente) par noyau.

Donc, techniquement, vous pouvez commencer trop de tâches dans la piscine qui attendent l'achèvement d'une autre opération ASYNC (qui est exécutée à travers la piscine de thread). Par conséquent, la tâche dans la piscine ne sera pas publiée et une tâche ASYNC ne commencera pas car il n'y a pas de filetage disponible.

Vous pouvez trouver des exemples et une explication plus précise ici: Programmation du piscine de thread. Deadlocks


0 commentaires

5
votes

Ceci est un code typique pour créer une impasse dans le code C #. Checkout Cet article MSDN: http://msdn.microsoft.com/en-us/ Magazine / CC188793.ASPX

using System;

using System.Threading;


public class Simple {

    static object A = new object();

    static object B = new object();


    static void MethodA()
    {
        Console.WriteLine("Inside methodA");
        lock (A)
        {
            Console.WriteLine("MethodA: Inside LockA and Trying to enter LockB");
            Thread.Sleep(5000);           
            lock (B)
            {
                Console.WriteLine("MethodA: inside LockA and inside LockB");
                Thread.Sleep(5000);
            }
            Console.WriteLine("MethodA: inside LockA and outside LockB");
        }
        Console.WriteLine("MethodA: outside LockA and outside LockB");
    }

    static void MethodB()
    {
        Console.WriteLine("Inside methodB");
        lock (B)
        {
            Console.WriteLine("methodB: Inside LockB");
            Thread.Sleep(5000);
            lock (A)
            {
                Console.WriteLine("methodB: inside LockB and inside LockA");
                Thread.Sleep(5000);
            }
            Console.WriteLine("methodB: inside LockB and outside LockA");
        }
        Console.WriteLine("methodB: outside LockB and outside LockA");
    }

    public static void Main(String[] args)
    {

        Thread Thread1 = new Thread(MethodA);
        Thread Thread2 = new Thread(MethodB);
        Thread1.Start();
        Thread2.Start();
        Console.WriteLine("enter.....");
        Console.ReadLine();

    }
}


0 commentaires

1
votes

Pour répondre à la partie de votre question sur la détection de l'impasse, je doute plutôt que cela est généralement possible. Il est similaire en question avec le problème d'arrêt, vous ne pouvez pas calculer efficacement la sémantique. Un moyen de surmonter ceci est d'utiliser un chien de garde qui sonderait périodiquement chaque thread si elle est toujours en vie et donnez-lui un certain délai d'attente à répondre, si 2 threads ne répondent pas, vous pouvez supposer qu'ils sont soit trop occupés, soit ils sont morts. verrouillé.


0 commentaires