算法设计原理:
(a) 系统生成多个生产者和多个消费者,但只有一个缓冲池,定义一个object量mylock作为临界变量以控制生产者与消费者工作的时机。
(b) Producer:通过lock函数锁住临界变量mylock来实现阻塞队列同时实现对于任务队列的修改,然后再释放出一个信号量给Consumer函数接收。
©Consumer:首先要等待Producer释放的信号量,接收到信号量以后,再用lock函数锁住临界变量mylock阻塞队列同时实现对于任务队列的修改,但是这里的Consumer不需要释放信号量,也就是说生产者的生产不受消费者约束,更加符合实际。
伪代码:
private Queue TaskQueue = new Queue();
private Semaphore TaskSemaphore = new Semaphore(0, 256);
private object myLock = new object();
void producer(){
while(true){
lock (myLock) // 通过用lock锁住临界变量实现阻塞
{
TaskQueue.Enqueue(Task);//任务进入队列,执行放入产品的操作
}
TaskSemaphore.Release(1);
}
}
void consumer(){
while(true){
TaskSemaphore.WaitOne();//等待信号量
lock (myLock) // 通过用lock锁住临界变量实现阻塞
{
GetTask = TaskQueue.Dequeue();//从队列中获取任务,执行拿出产品的操作
}
}
}
完整代码:
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 PC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private static bool StopFlag = false;
private void Form1_Load(object sender, EventArgs e)
{
}
public class Ta