Note that there are some explanatory texts on larger screens.

plurals
  1. POC# Producer/Consumer pattern
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload