[c++]代码库
<pre class="prettyprint brush:cpp;">#include <windows.h>
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string>
DWORD WINAPI Thread1(LPVOID lpPara); //线程1
DWORD WINAPI Thread2(LPVOID lpPara); //线程2
DWORD WINAPI Thread3(LPVOID lpPara); //线程3
HANDLE MS[3]; //互斥信号
HANDLE RS[3]; //同步信号
struct Buffer
{
int BufNo; //缓冲区号
int buf; //缓冲区内容
Buffer *next; //下一个缓冲区的指针
};
class BufferQueue //缓冲队列类
{
public:
BufferQueue();
~BufferQueue();
bool isEmpty();
void enqueue(int n,int x=-1); //入队
Buffer *dequeue(); //出队
private:
Buffer *front,*rear;
};
BufferQueue::BufferQueue() //构造
{
front=rear=NULL;
}
BufferQueue::~BufferQueue() //析构
{
Buffer *q=front,*p;
while(q!=NULL)
{
p=q;
q=q->next;
delete p;
}
front=rear=NULL;
}
bool BufferQueue::isEmpty() //判断是否空队列
{
return front==NULL&&rear==NULL;
}
void BufferQueue::enqueue(int n,int x) //入队
{
Buffer *q=new Buffer;
if(x!=-1) //插入非空缓冲区
q->buf=x;
q->BufNo=n; //缓冲区序号
if(isEmpty()) //空队列插入
front=q;
else
rear->next=q; //列尾插入
rear=q;
}
Buffer *BufferQueue::dequeue() //出队
{
Buffer *q=front;
front=front->next;
if(front==NULL) //空队列时,首尾同步
rear=NULL;
return q;
}
BufferQueue emp,inq,outq; //3个缓冲队列
Buffer* takeBuf(int type); //从type类型缓冲队列头取出一个缓冲区
void addBuf(int type,Buffer* buffer); //将buffer插入type类型队列尾
Buffer* getBuf(int type); //包含了同步和互斥控制的takeBuf操作
void putBuf(int type, Buffer* buffer); //包含了同步和互斥控制的addBuf操作
enum type{empty,input,output}; //类型
int main()
{
DWORD ThreadId1, ThreadId2,ThreadId3;
for(int a=0;a<20;a++) //假设20个缓冲区
emp.enqueue(a);
for(int a=0;a<3;a++) //3个互斥信号
MS[a]=CreateMutex(NULL,FALSE,"qemtx");
RS[0]=CreateSemaphore(NULL,20,20, "esp"); //3个同步信号
RS[1]=RS[2]=CreateSemaphore(NULL,0,20, "iosp");
HANDLE ithread = CreateThread(NULL,0,Thread1,NULL,0,&ThreadId1);
HANDLE cthread = CreateThread(NULL,0,Thread2,NULL,0,&ThreadId1);
HANDLE othread = CreateThread(NULL,0,Thread3,NULL,0,&ThreadId1);
if(ithread == NULL||cthread == NULL||othread == NULL)
return -1;
getchar();
}
Buffer* takeBuf(int type) //从type类型缓冲队列头取出一个缓冲区
{
switch(type)
{
case 0: return emp.dequeue();
case 1: return inq.dequeue();
case 2: return outq.dequeue();
}
}
void addBuf(int type,Buffer* buffer) //将buffer插入type类型队列尾
{
switch(type)
{
case 0: emp.enqueue(buffer->BufNo,buffer->buf); break;
case 1: inq.enqueue(buffer->BufNo,buffer->buf); break;
case 2: outq.enqueue(buffer->BufNo,buffer->buf); break;
}
}
Buffer* getBuf(int type) //包含了同步和互斥控制的takeBuf操作
{
WaitForSingleObject(RS[type],INFINITE);
WaitForSingleObject(MS[type],INFINITE);
Buffer *q= takeBuf(type);
ReleaseMutex(MS[type]);
return q;
}
void putBuf(int type, Buffer* buffer) //包含了同步和互斥控制的addBuf操作
{
WaitForSingleObject(MS[type],INFINITE);
addBuf(type,buffer);
ReleaseSemaphore(RS[type],1,NULL);
ReleaseMutex(MS[type]);
}
DWORD WINAPI Thread1(LPVOID lpPara)
{
int rn=1;
while(rn<41) //假设40个整数
{
Buffer *hin=getBuf(0);
char s1[10],s2[10];
string tr=string("输入进程: 缓冲单元")+itoa(hin->BufNo,s1,10)+" 收容输入 data="+itoa(rn,s2,10)+"\n";
cout<<tr;
hin->buf=rn;
putBuf(1,hin);
rn++;
Sleep(120);
}
}
DWORD WINAPI Thread2(LPVOID lpPara)
{
int n=0;
while(true)
{
if(!inq.isEmpty())
{
Buffer *sin=getBuf(1);
n=sin->buf;
sin->buf=-1;
putBuf(0,sin);
char s1[10],s2[10];
string tr=string("计算进程: 缓冲单元")+itoa(sin->BufNo,s1,10)+" 提取输入 data="+itoa(n,s2,10)+"\n";
cout<<tr;
Sleep(80);
n=n+10000;
Buffer *hout=getBuf(0);
tr=string("计算进程: 缓冲单元")+itoa(hout->BufNo,s1,10)+" 收容输出 data="+itoa(n,s2,10)+"\n";
cout<<tr;
hout->buf=n;
putBuf(2,hout);
}
}
}
DWORD WINAPI Thread3(LPVOID lpPara)
{
while(true)
{
if(!outq.isEmpty())
{
Buffer *sout=getBuf(2);
char s1[10],s2[10];
string tr=string("输出进程: 缓冲单元")+itoa(sout->BufNo,s1,10)+" 提取输出 data="+itoa(sout->buf,s2,10)+"\n";
cout<<tr;
sout->buf=-1;
putBuf(0,sout);
Sleep(120);
}
}
}
</pre>
<br /><p>
</p>