quelqu'un peut-il m'expliquer avec un exemple simple pour gérer Monitor.PulseAll(). J'ai déjà passé quelques exemples de ce stackoverflow. Comme je suis un débutant je sens que ce sont au-dessus de ma tête.Besoin d'aide dans Monitor.PulseAll()
Répondre
Que diriez-vous (pour montrer l'interaction):
static void Main()
{
object obj = new object();
Console.WriteLine("Main thread wants the lock");
lock (obj)
{
Console.WriteLine("Main thread has the lock...");
ThreadPool.QueueUserWorkItem(ThreadMethod, obj);
Thread.Sleep(1000);
Console.WriteLine("Main thread about to wait...");
Monitor.Wait(obj); // this releases and re-acquires the lock
Console.WriteLine("Main thread woke up");
}
Console.WriteLine("Main thread has released the lock");
}
static void ThreadMethod(object obj)
{
Console.WriteLine("Pool thread wants the lock");
lock (obj)
{
Console.WriteLine("Pool thread has the lock");
Console.WriteLine("(press return)");
Console.ReadLine();
Monitor.PulseAll(obj); // this signals, but doesn't release the lock
Console.WriteLine("Pool thread has pulsed");
}
Console.WriteLine("Pool thread has released the lock");
}
Re signalisation; lorsqu'il s'agit de Monitor
(aka lock
), il existe deux types de blocage; il y a la "file d'attente prête", où les threads sont mis en file d'attente en attente d'exécution. Sur la ligne après Console.WriteLine("Pool thread wants the lock");
, la file d'attente de pool entre dans la file d'attente prête. Lorsque le verrou est libéré, un thread de la file d'attente prête peut acquérir le verrou.
La deuxième file d'attente concerne les threads qui doivent être éveillés; l'appel à Wait
place le thread dans cette deuxième file d'attente (et libère temporairement le verrou). L'appel à PulseAll
déplace tous les threads de cette deuxième file dans la file d'attente prête (Pulse
ne déplace qu'un seul thread), de sorte que lorsque le thread de pool libère le verrou, le thread principal est autorisé à reprendre le verrou. Cela semble complexe (et c'est peut-être le cas) - mais ce n'est pas aussi grave que ça en a l'air ... franchement. Cependant, le code d'enfilage est toujours difficile, et doit être abordé avec prudence et une tête claire.
Monitor.Wait()
attendra toujours une impulsion.
Ainsi, le principal est:
- En cas de doute,
Monitor.Pulse()
- Si le doute subsiste,
Monitor.PulseAll()
Autre que cela, je ne sais pas ce que vous demandez. Pourriez-vous élaborer?
Edit:
Votre disposition générale devrait être:
Monitor.Enter(lock);
try
{
while(!done)
{
while(!ready)
{
Monitor.Wait(lock);
}
// do something, and...
if(weChangedState)
{
Monitor.Pulse(lock);
}
}
}
finally
{
Monitor.Exit(lock);
}
Merci John.Je suis vraiment reconnaissant envers vous. :) – Prabugoel
La serrure ne sera-t-elle pas automatiquement relâchée? ou avons-nous besoin de le spécifier explicitement? je veux dire Monitor.Exit (lock)? – Prabugoel
@Prabugoel Si vous utilisez 'lock (obj) {}', le verrou sera automatiquement libéré. Si vous utilisez 'Monitor.Enter()', vous devez explicitement 'Monitor.Exit()'. Comment le runtime pourrait-il savoir quand libérer le verrou? 'lock (obj)' est juste un raccourci pour entrer et sortir. – bzlm
- 1. La différence entre Monitor.Pulse et Monitor.PulseAll
- 2. besoin REGEXP Matching dans MySQL
- 3. Besoin d'aide dans le radiobutton dans gridview
- 4. Besoin besoin Allocatable Array en FORTRAN
- 5. Besoin dans l'analyseur SQL sur Delphi
- 6. Besoin d'aide dans le contrôle dropdownlist
- 7. Besoin d'aide dans l'authentification de la page
- 8. Besoin d'aide dans les contraintes clés uniques
- 9. Besoin de% NOTFOUND dans le curseur
- 10. Besoin d'accélérer cette requête dans SQL Server
- 11. Besoin d'aide dans la requête complexe sql
- 12. Besoin d'aide avec l'affichage YUV dans OpenGl
- 13. Dans Workflow besoin d'écouter pour plusieurs événements
- 14. besoin d'aide avec Dynamic Pivotant dans SQL2005
- 15. Besoin d'aide dans la transaction SQL Rollback
- 16. Besoin d'afficher la liste d'amis de facebook sur mon application? Besoin d'aide dans FBML
- 17. Besoin de refactoriser?
- 18. Besoin d'aide avec String.format
- 19. Besoin d'aide dans le code de connexion dans asp .net
- 20. Besoin d'aide dans l'édition dynamique événement bouton dans asp.net
- 21. J'ai besoin d'aide dans la fonction Annuler dans Java
- 22. Besoin d'un conseil CSS
- 23. Ruby incapable d'utiliser besoin
- 24. Besoin jGrid avec Json
- 25. besoin d'implémenter Compteur C#
- 26. besoin JET 4.0 Pilotes
- 27. Besoin de ClassInterfaceType.None?
- 28. Sql Interrogation Besoin d'aide
- 29. Besoin d'aide avec UIText
- 30. Besoin d'aide complexe rejoindre
Merci Marc.J'ai vu votre poste plusieurs.Ils sont excellents et simples à comprendre.Merci beaucoup du fond de mon cœur. – Prabugoel
Marc une question.Here Signalisation signifie "Je suis sur le point de libérer"? – Prabugoel
Non; mettra à jour... –