fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4.  
  5. public class Test
  6. {
  7. public static void Main()
  8. {
  9. new PulseWaitExample().Run();
  10. }
  11.  
  12. }
  13. public static class Dumper{
  14. public static void Dump(this object o, string comment = null){
  15. Console.WriteLine((comment != null? comment+ ": " : "" ) + o.ToString());
  16. }
  17. }
  18. public class PulseWaitExample
  19. {
  20. int i = 0;
  21. private Queue<int> queue= new Queue<int>();
  22. private volatile bool running=true;
  23. int consumed;
  24. public void Run(){
  25. Thread tp1 = new Thread(ProducerThreadProc);
  26. Thread tp2 = new Thread(ProducerThreadProc);
  27. Thread tc1 = new Thread(ConsumerThreadProc);
  28. Thread tc2 = new Thread(ConsumerThreadProc);
  29.  
  30. Thread ender = new Thread(()=> {
  31. Thread.Sleep(300);
  32. running = false;
  33. });
  34. tp1.Start();
  35. //tp2.Start();
  36. tc1.Start();
  37. //tc2.Start();
  38. //ender.Start();
  39. tp1.Join();
  40. tc1.Join();
  41. i.Dump("Produced");
  42. consumed.Dump("consumed");
  43. }
  44. private void ProducerThreadProc()
  45. {
  46. while (running)
  47. {
  48. int produced = Interlocked.Increment(ref i);
  49. "Prod will lock".Dump();
  50. lock (queue)
  51. {
  52. "Prod locked".Dump();
  53. queue.Enqueue(produced);
  54. if(produced > 30){
  55. running = false;
  56. }
  57. ("Prod produced " + produced).Dump();
  58. "Prod will pulse".Dump();
  59. Monitor.Pulse(queue);
  60. "Prod pulsed, will unlock".Dump();
  61. }
  62. "Prod unlocked".Dump();
  63. }
  64. }
  65.  
  66. private void ConsumerThreadProc()
  67. {
  68. while (running)
  69. {
  70. int toBeConsumed;
  71. "Cons will lock".Dump();
  72. lock (queue)
  73. {
  74. if (queue.Count == 0)
  75. {
  76. "Cons locked, will start to wait".Dump();
  77. Monitor.Wait(queue);
  78. "Cons done waiting".Dump();
  79. }
  80. toBeConsumed = queue.Dequeue();
  81. consumed = toBeConsumed;
  82. ("Cons Consumed " + toBeConsumed).Dump();
  83. "Cons will unlock".Dump();
  84. }
  85. "Cons unlocked".Dump();
  86. }
  87. }
  88. }
Success #stdin #stdout 0.02s 16312KB
stdin
Standard input is empty
stdout
Prod will lock
Prod locked
Prod produced 1
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 2
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 3
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 4
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 5
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 6
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 7
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 8
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 9
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 10
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 11
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 12
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 13
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 14
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 15
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 16
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 17
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 18
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 19
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 20
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 21
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 22
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 23
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 24
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 25
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 26
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 27
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 28
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 29
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 30
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Prod will lock
Prod locked
Prod produced 31
Prod will pulse
Prod pulsed, will unlock
Prod unlocked
Produced: 31
consumed: 0