首页 > 代码库 > 多线程编程之生产者和消费者之间的问题
多线程编程之生产者和消费者之间的问题
前段时间没事研究了一些生产者和消费者之间的问题,期间也查看了不少资料。又重新有了新的认识。特别作为一个IT农民工,必须要掌握的技能啊。
个人理解,这个应该说是一种模型吧,学会它,可以应用到多个方面的技术上去。数据流文件的读写,程序中的数据缓冲技术,播放缓冲技术等等。
废话不多说。。。直接上代码。下面是个C# 写的代码。比较粗糙,请谅解,有问题大家可以一起讨论研究。
1 using System; 2 using System.Threading; 3 4 namespace Consumer 5 { 6 /// <summary> 7 /// </summary> 8 /// 用数组控制缓冲区,需要自己定义控制读取的位置 9 public class BufferInArray10 {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 =http://www.mamicode.com/ 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 Producer52 {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 Consumer70 {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 =http://www.mamicode.com/ shared.GetBuffer();84 }85 }86 }87 }
这个Demo是用的单缓冲数组技术。后续我还有双缓冲,环形缓冲等等。。。。
多线程编程之生产者和消费者之间的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。