多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
2010-08-26 22:26
881 查看
http://www.cnblogs.com/heaipin g/archive/2010/08/26/thread_ManualResetEvent.html
Set()-->有信号;
ReSet() -->无信号
Set()-->有信号;
ReSet() -->无信号
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace ManualResetEventTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { int result = 0; Cell cell = new Cell(); ManualResetEvent eventX = new ManualResetEvent(false); CellProd prod = new CellProd(cell, 20, eventX); CellCons cons = new CellCons(cell, 20, eventX); Thread producer = new Thread(new ThreadStart(prod.ThreadRun)); Thread consumer = new Thread(new ThreadStart(cons.ThreadRun)); try { producer.Start(); consumer.Start(); producer.Join(); consumer.Join(); Console.ReadLine(); } catch (ThreadStartException ex) { Console.WriteLine(ex); result = 1; } catch (ThreadInterruptedException ex) { Console.WriteLine(ex); result = 1; } Environment.ExitCode = result; } private void button1_Click(object sender, EventArgs e) { int result = 0; Cell cell = new Cell(); ManualResetEvent eventX = new ManualResetEvent(false); CellProd prod = new CellProd(cell, 20, eventX); CellCons cons = new CellCons(cell, 20, eventX); Thread producer = new Thread(new ThreadStart(prod.ThreadRun)); Thread consumer = new Thread(new ThreadStart(cons.ThreadRun)); try { producer.Start(); consumer.Start(); producer.Join(); consumer.Join(); Console.ReadLine(); } catch (ThreadStartException ex) { Console.WriteLine(ex); result = 1; } catch (ThreadInterruptedException ex) { Console.WriteLine(ex); result = 1; } Environment.ExitCode = result; } } public class Cell { int cellContents; public int ReadFromCell()//读(消费) { lock (this) { Console.WriteLine("Consume:{0}", cellContents); } return cellContents; } public void WriteToCell(int n)//写(生产) { lock (this) { cellContents = n; Console.WriteLine("Produce:{0}", cellContents); } } } /// <summary> /// 生产者 /// </summary> public class CellProd { Cell cell; int quantity = 1;//生产者生产次数 ManualResetEvent eventX; public CellProd(Cell cell, int request, ManualResetEvent eventX) { this.cell = cell; quantity = request; this.eventX = eventX; } public void ThreadRun() { for (int looper = 1; looper <= quantity; looper++) { cell.WriteToCell(looper);//生产 eventX.Set();//发信号,告诉消费者我已经生产,你可以消费啦 Thread.Sleep(1000); } } } /// <summary> /// 消费者 /// </summary> public class CellCons { Cell cell; int quantity = 1; ManualResetEvent eventX; public CellCons(Cell cell, int request, ManualResetEvent eventX) { this.cell = cell; quantity = request; this.eventX = eventX; } public void ThreadRun() { for (int looper = 1; looper <= quantity; looper++) { eventX.WaitOne();//一直在苦苦等待生产者生产的产品 cell.ReadFromCell();//等到了,消费 eventX.Reset();//告诉自己,这个东西我已经消费了, //不能再次消费了,只能WaitOne下一次了 } } } }
相关文章推荐
- 多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
- IOS多线程使用GCD与信号量实现生产者与消费者模式
- Java多线程——使用wait/notify实现生产者/消费者模式
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java线程间同步实现生产者-消费者模式
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- python生产者与消费者模式:队列实现线程通信、ThreadLocal、GIL
- 同步线程--生产者与消费者模式
- JAVA线程同步——消费者和生产者模式
- python中线程的使用以及生产者和消费者的实现
- Java多线程之线程间通信--生产者/消费者模式
- 【转载】多线程--C#利用多线程实现消费者和生产者模式
- 使用Object类中的wait()和notify()方法实现生产者和消费者模式
- 使用Object.wait与notify实现生产者与消费者模式
- C# 使用 AutoResetEvent 或 ManualResetEvent 同步两个线程