多线程编程之生产者和消费者之间的问题
前段时间没事研究了一些生产者和消费者之间的问题,期间也查看了不少资料。又重新有了新的认识。特别作为一个IT农民工,必须要掌握的技能啊。
个人理解,这个应该说是一种模型吧,学会它,可以应用到多个方面的技术上去。数据流文件的读写,程序中的数据缓冲技术,播放缓冲技术等等。
废话不多说。。。直接上代码。下面是个C# 写的代码。比较粗糙,请谅解,有问题大家可以一起讨论研究。
1 using System; 2 using System.Threading; 3 4 namespace Consumer 5 { 6 /// <summary> 7 /// </summary> 8 /// 用数组控制缓冲区,需要自己定义控制读取的位置 9 public class BufferInArray 10 { 11 public const int BufferSize = 20; 12 public const int Max = 1000; 13 private int[] buffer = new int[BufferSize]; 14 15 private int bufferCount = 0; 16 17 private int readLocation = 0, writeLocation = 0; 18 19 public int GetBuffer() 20 { 21 lock (this) 22 { 23 if (bufferCount == 0) 24 { 25 Monitor.Wait(this); 26 } 27 int readValue = buffer[readLocation]; 28 bufferCount--; 29 readLocation = (readLocation + 1) % buffer.Length; 30 Monitor.Pulse(this); 31 return readValue; 32 } 33 } 34 35 public void SetBuffer(int writeValue) 36 { 37 lock (this) 38 { 39 if (bufferCount ==BufferSize) 40 { 41 Monitor.Wait(this); 42 } 43 buffer[writeLocation] = writeValue; 44 bufferCount++; 45 writeLocation = (writeLocation + 1) % buffer.Length; 46 Monitor.Pulse(this); 47 } 48 } 49 } 50 51 public class Producer 52 { 53 BufferInArray shared; 54 55 public Producer(BufferInArray sharedLocation) 56 { 57 shared = sharedLocation; 58 } 59 60 public void produce() 61 { 62 for (int count = 1; count <= BufferInArray.Max; count++) 63 { 64 shared.SetBuffer(count); 65 } 66 } 67 } 68 69 public class Consumer 70 { 71 private int value; 72 BufferInArray shared; 73 74 public Consumer(BufferInArray sharedLocation) 75 { 76 shared = sharedLocation; 77 } 78 79 public void consume() 80 { 81 for (int count = 1; count <= BufferInArray.Max; count++) 82 { 83 value = shared.GetBuffer(); 84 } 85 } 86 } 87 }
这个Demo是用的单缓冲数组技术。后续我还有双缓冲,环形缓冲等等。。。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。