title: C# Producer/Consumer pattern
body: <p>I have simple one-producer/two-consumers code as follows but the output shows that only <code>C2</code> is consuming. Are there any bugs in my code? </p>
  
  <pre><code>class Program
  {
      static void Main(string[] args)
      {
          Object lockObj = new object();
          Queue&lt;string&gt;  queue = new Queue&lt;string&gt;();
          Producer p = new Producer(queue, lockObj);
          Consumer c1 = new Consumer(queue, lockObj, "c1");
          Consumer c2 = new Consumer(queue, lockObj, "c2");
  
          Thread t1 = new Thread(c1.consume);
          Thread t2 = new Thread(c2.consume);
          t1.Start();
          t2.Start();
  
          Thread t = new Thread(p.produce);
          t.Start();
  
          Console.ReadLine();
      } 
  }
  public class Producer
  {
      Queue&lt;string&gt; queue;
      Object lockObject;
      static int seq = 0;
      public Producer(Queue&lt;string&gt; queue, Object lockObject)
      {
          this.queue = queue;
          this.lockObject = lockObject; 
      }
  
      public void produce()
      {
          while( seq++ &lt;15) //just testinng 15 items
          {
              lock (lockObject)
              {
                  string item = "item" + seq;
                  queue.Enqueue(item);
                  Console.WriteLine("Producing {0}", item);
                  if (queue.Count == 1)
                  { // first
                      Monitor.PulseAll(lockObject);
                  }
              }
          }
      }
  
  }
  
  public class Consumer
  {
      Queue&lt;string&gt; queue;
      Object lockObject;
      string name;
      public Consumer(Queue&lt;string&gt; queue, Object lockObject, string name)
      {
          this.queue = queue;
          this.lockObject = lockObject; 
          this.name = name;
      }
  
      public void consume()
      {
          string item;
          while (true)
          {
              lock (lockObject)
              {
                  if (queue.Count == 0)
                  { 
                      Monitor.Wait(lockObject);
                      continue; 
                  }
                  item = queue.Dequeue();
                  Console.WriteLine(" {0} Consuming {1}", name, item);
              }
          }
      }
  }
  </code></pre>
  
  <p>The output is:</p>
  
  <pre class="lang-none prettyprint-override"><code>Producing item1
   c2 Consuming item1
  
  Producing item2
   c2 Consuming item2
  
  Producing item3
   c2 Consuming item3
  
  Producing item4
   c2 Consuming item4
  
  Producing item5
   c2 Consuming item5
  
  Producing item6
   c2 Consuming item6
  
  Producing item7
   c2 Consuming item7
  
  Producing item8
   c2 Consuming item8
  
  Producing item9
   c2 Consuming item9
  
  Producing item10
   c2 Consuming item10
  
  Producing item11
   c2 Consuming item11
  
  Producing item12
   c2 Consuming item12
  
  Producing item13
   c2 Consuming item13
  
  Producing item14
   c2 Consuming item14
  
  Producing item15
   c2 Consuming item15
  </code></pre>