What's difference between Pulse and PulseAll which are static methods in Monitor class ? Let us have a look at msdn introduction at first. 

      Pulse  :     Notifies a thread in the waiting queue of a change in the locked object's state. 

      PulseAll :  Notifies all waiting threads of a change in the object's state.


      We have to know waiting queue and ready queue in order to understand multi-thread and lock. All threads in ready queue have chances to be executed, and all threads in waiting queue must enter ready queue before execution. When we call Monitor.Wait(), the thread will step into waiting queue and realse its lock. Simultaneously, a single thread will be moved to ready queue if Monitor.Pulse() is called, or all threads will be done if PulseAll() is called. In the later scenario, all threads have chance to run. But in multi-thread programming, when a thread gets a chance, it will try to get a lock in our code generally, then other threads  related to that lock cannot go on. This is also the reason why a few people don't understand their difference. Souce code is the best way to make an explanation.


   

Pulse vs PulseAll_sedusing System;

Pulse vs PulseAll_sedusing System.Collections.Generic;

Pulse vs PulseAll_sedusing System.Text;

Pulse vs PulseAll_sedusing System.Threading;

Pulse vs PulseAll_sedusing System.Collections.Specialized;

Pulse vs PulseAll_sed

Pulse vs PulseAll_sed

Pulse vs PulseAll_sednamespace PulseVsPulseAll

Pulse vs PulseAll_sed_09Pulse vs PulseAll_sed_10Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13    /**//// <summary>

Pulse vs PulseAll_sed_14    /// The order of this program is to show difference between Pulse and PulseAll

Pulse vs PulseAll_sed_15    /// </summary>

Pulse vs PulseAll_sed_14    class Program

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13    Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14        public static StringCollection list = new StringCollection();

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14        static void Main(string[] args)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13        Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14            Thread t1 = new Thread(new ThreadStart(Fun1));

Pulse vs PulseAll_sed_14            t1.Name = "t1";

Pulse vs PulseAll_sed_14            Thread t2 = new Thread(new ThreadStart(Fun2));

Pulse vs PulseAll_sed_14            t2.Name = "t2";

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14            int count = 0;

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14            Console.WriteLine("Press Enter to StartPulse vs PulseAll_sed_11");

Pulse vs PulseAll_sed_14            Console.ReadLine();

Pulse vs PulseAll_sed_14            t1.Start();

Pulse vs PulseAll_sed_14            t2.Start();

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14            while (true)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13            Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14               Thread.Sleep(3000);

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14                count++;

Pulse vs PulseAll_sed_14                string hotdog = count.ToString() + "*" + "hotdog";

Pulse vs PulseAll_sed_14                Console.WriteLine();

Pulse vs PulseAll_sed_14                Console.WriteLine("Producer: "+hotdog);

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14                try

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                    Monitor.Enter(list);

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14                    list.Add(hotdog);

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14                    Monitor.PulseAll(list); // Try Monitor.PulseAll(list); which will induce other codes to throw exception,

Pulse vs PulseAll_sed_14                                         // because it will notify all waiting threads binding to list.

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_15                }

Pulse vs PulseAll_sed_14                finally

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                    Monitor.Exit(list);

Pulse vs PulseAll_sed_15                }

Pulse vs PulseAll_sed_14               

Pulse vs PulseAll_sed_15            }

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14            t1.Join();

Pulse vs PulseAll_sed_14            t2.Join();

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14            Console.ReadLine();

Pulse vs PulseAll_sed_15        }

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14        public static void Fun1()

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13        Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14            while (true)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13            Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14                    if (list.Count == 0)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                    Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                        lock (list)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                        Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                            Monitor.Wait(list);

Pulse vs PulseAll_sed_14                            Console.WriteLine("Fun1#" + "Released");

Pulse vs PulseAll_sed_15                        }

Pulse vs PulseAll_sed_15                    }

Pulse vs PulseAll_sed_14                    else

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                    Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                        Thread.Sleep(1000);

Pulse vs PulseAll_sed_14                        string hotdog = list[0];

Pulse vs PulseAll_sed_14                        list.RemoveAt(0);

Pulse vs PulseAll_sed_14                        Console.WriteLine("Fun1" + "#" + hotdog);

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_15                    }

Pulse vs PulseAll_sed_14   

Pulse vs PulseAll_sed_15            }

Pulse vs PulseAll_sed_15        }

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_14        public static void Fun2()

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13        Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14            while (true)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13            Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14               

Pulse vs PulseAll_sed_14                    if (list.Count == 0)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                    Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                        lock(list)

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                        Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                            Monitor.Wait(list);

Pulse vs PulseAll_sed_14                            Console.WriteLine("Fun2#" + "Released");

Pulse vs PulseAll_sed_15                        }

Pulse vs PulseAll_sed_15                    }

Pulse vs PulseAll_sed_14                    else

Pulse vs PulseAll_sed_12Pulse vs PulseAll_sed_13                    Pulse vs PulseAll_sed_11{

Pulse vs PulseAll_sed_14                        Thread.Sleep(1000);

Pulse vs PulseAll_sed_14                        string hotdog = list[0];

Pulse vs PulseAll_sed_14                        list.RemoveAt(0);

Pulse vs PulseAll_sed_14                        Console.WriteLine("Fun2" + "#" + hotdog);

Pulse vs PulseAll_sed_14                       

Pulse vs PulseAll_sed_15                    }

Pulse vs PulseAll_sed_14

Pulse vs PulseAll_sed_15             }

Pulse vs PulseAll_sed_14            

Pulse vs PulseAll_sed_15        }

Pulse vs PulseAll_sed_15    }

Pulse vs PulseAll_sed_151}

Pulse vs PulseAll_sed


 

The code is urgly, but can explain the problem well. If we cover the entire "if" branch code In Fun1() and Fun2 with "lock", it won't be direct to show the question.

 When the main thread creates a hotdog, it will notify one of the current wainting threads in waiting queue to enter ready queue and run, it can work well. But when we take place of Pulse() with PulseAll(), both of the current waiting threads will get chance to run, and will generate race condition. In this program, it will throw an exception, because both threads fetch a hotdog, one of them will fail.

  

    Practise to improve English.