2013-03-06 6 views
1

J'ai une question concernant le pouls et l'attente de la classe moniteur. Voici l'extrait de code. Ma question est-ce que le code soit bloqué àC#: impulsion et attente

// < < -----------

jusqu'au casier devient libre?

 { 
     check = false; 
     new Thread(pulseWaitFun).Start(); 

     Console.Writeline("Threading tutorial"); 

     lock (locker) // <<----------- 
     { 
      check = true; 
      Monitor.Pulse(locker); 
     } 
     Console.ReadLine(); 
    } 

    static void pulseWaitFun() 
    { 
     lock (locker) 
     { 
      if(check != true) 
      { 
       Thread.Sleep(20000); 
       Monitor.Wait(locker); 

      } 
     } 

     Console.WriteLine("Woken !!"); 
    } 

deuxième question, après Monitor.Pulse(locker); ce sera la séquence suivante d'exécution?

+0

Smells comme les devoirs – Nolonar

+0

juste jeter un oeil ici: http://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified –

+0

Pas ses pas. Juste pour effacer mes concepts! – user2140086

Répondre

3

Q est-ce que le code sera bloqué à ... jusqu'à ce que le casier devienne libre?

Oui, mais le verrou peut être libéré par la sortie d'un bloc lock() {}OU en entrant un Wait().

après Monitor.Pulse (casier); ce qui suivra la séquence d'exécution?

Dans votre code la séquence sera très probablement:

  1. Thread(pulseWaitFun).Start();
  2. lock (locker), non contestée de sorte que le verrou est immédiatement accordé
  3. Monitor.Pulse(locker);, le pouls est gaspillée parce que personne ne vous attend.
  4. sortie lock() dans la principale méthode
  5. Le 2ème fil commence à exécuter ...

Vous voulez probablement un Thread.Sleep(100) intérieur Main(), après le démarrage du fil.

+0

Donc si j'ai Thread.Sleep (100) 'après avoir démarré le fil principal alors cet ordre d'exécution mentionné par vous changera-t-il? – user2140086

+0

@Henk Dans son cas particulier avec Console.Writeline après le démarrage, pulseWaitFun est exécuté en premier et se verrouille. – Alex

+0

@Alex - probablement. Ce que j'aurais dû souligner, c'est que c'est non-déterministe. –

1

Vous ne pouvez pas supposer lequel des verrous sera invoqué en premier. Considérons deux options:

  • La méthode principale de verrouillage est atteinte en premier. La vérification est définie sur true. L'invocation de Pulse n'a aucun effet. Le thread principal suivant libère le verrou et le second thread peut l'acquérir dans pulseWaitFun.
  • La méthode lockWaitFun est atteinte en premier. La vérification est fausse, donc le thread est en train de dormir, puis attend le signal qui provoque la réalisation du verrou. Maintenant, le fil principal acquiert la serrure et les impulsions. Puis libère le verrou. Après que pulseWaitFun peut continuer.
Questions connexes