模拟内容
1、实现对经典的生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者-消费者问题是著名的进程同步问题。它描述一组生产者向一组消费者提供产品,它们共享一个有界缓冲池,生产者的任务是向其中投放产品,消费者从中取得产品。
2、假定生产者和消费者是互相等效的,只要缓冲池未满,生产者就可以将生产出的产品放入其中;而只要缓冲池未空,消费者就可以从缓冲池中拿走产品。
3、生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。他们之间也存在互斥,缓冲池被占用时,任何进程都不能访问,即生产者、消费者必须互斥访问缓冲池。
模拟思路
1、随机产生每个生产者生产一个产品的时间和每个消费者消费一个产品的时间,并显示出来。
2、随着时间的推移,体现生产者生产一个产品的过程和消费者消费一个产品的过程,并统计出生产产品的总数和消费产品的总数。
3、限制缓冲池中缓冲区的容量,如只能容纳N个产品。当缓冲池已满时,要能够体现出生产者处于等待的情形;当缓冲区为空时,要能够体现出消费者处于等待的情形。
实现方法
使用random类的对象产生随机数随机生成生产者和消费者的生产和消费时间,采用线程的sleep函数让当前正在运行线程挂起模拟生产者或消费者生产或消费的过程,采用c#窗体中的timer定时器控件动态显示当前系统时间。
编程实现
初始化一些全局变量,包括随机生成的生产时间和消费时间,生产总数,消费总数,循环队列左右指针,互斥量等。
public Form1()
{
InitializeComponent();
Random ra = new Random();
timep = ra.Next(1, 10);//随机产生1-10的生产时间
timec = ra.Next(1, 10);//随机产生1-10的消费时间
this.lbptime.Text = "单位生产时间:" + timep.ToString() + "秒";
this.lbctime.Text = "单位消费时间:" + timec.ToString() + "秒";
}
int countp = 0;//生产总数
int countc = 0;//消费总数
int left = 0;//左指针
int right = 0;//右指针
int timep = 0;//生产时间
int timec = 0;//消费时间
int mutex = 1;//互斥量
int empty = 5;//空缓冲区的个数
int full = 0;//有产品的缓冲区的个数
消费者线程
void consumer() {
if (full > 0)
{
if (mutex == 1)
{
mutex = 0;
this.lbm.Text = "mutex:" + mutex.ToString();
consume(left);
left = (left + 1) % 5;
countc++;
this.lbc