Sleep(100);
////同步与互斥的控制
WaitForSingleObject(hsemOUTQ,INFINITE);
WaitForSingleObject(hmutexOUTQ,INFINITE);
Outputbuf = getBuf(OUTQ) ; //从输出队列中提取一个提取输出缓冲 区
cout<<\输出线程从 \缓冲单元 \提取输
出--->\
//Outputbuf->buf = -1 ; //提取完成后将该缓冲区回收
ReleaseMutex(hmutexOUTQ);
WaitForSingleObject(hmutexEMQ,INFINITE);
putBuf(EMQ,Outputbuf) ; //回收的把它挂载到空队列的队尾
ReleaseMutex(hmutexEMQ);
ReleaseSemaphore(hsemEMQ,1,NULL); }
return 0; }
//计算线程函数的实现
DWORD WINAPI CalThreadFunc(LPVOID lpPara) //计算线程函数 {
buffer* Calbuf1 = NULL;
buffer* Calbuf2 =NULL;
int nCal;
while(m_end) {
Sleep(10); //
休眠时间应很小
////同步与互斥的控制
WaitForSingleObject(hsemINQ,INFINITE);
WaitForSingleObject(hmutexINQ,INFINITE);
Calbuf1 = getBuf(INQ); //从输入队列中提取一个收容输入缓冲区
nCal = Calbuf1->buf; //提取数据
cout<<\计算线程从 \缓冲单元 \提取输入
--->\
//Calbuf->buf = -1 ; //
ReleaseMutex(hmutexINQ);
WaitForSingleObject(hmutexEMQ,INFINITE);
putBuf(EMQ,Calbuf1);
ReleaseMutex(hmutexEMQ);
ReleaseSemaphore(hsemEMQ,1,NULL);
nCal = nCal + 10000 ; //模拟输入数据的处理
WaitForSingleObject(hsemEMQ,INFINITE);
WaitForSingleObject(hmutexEMQ,INFINITE);
Calbuf2 = getBuf(EMQ); //得到一个空的缓冲区作为收容输出
Calbuf2->buf = nCal ; //存入运算结果
cout<<\计算线程从 \缓冲单元 \收容输出
--->\
ReleaseMutex(hmutexEMQ);
WaitForSingleObject(hmutexOUTQ,INFINITE); //把收容输出缓冲区挂
载到输出队列的队尾
putBuf(OUTQ,Calbuf2);
ReleaseMutex(hmutexOUTQ);
ReleaseSemaphore(hsemOUTQ,1,NULL); }
return 0 ; }
//从队列中得到队头结点函数(实际相当于删除一个结点操作)
buffer* getBuf(int type) {
buffer* Returnbuf = NULL;
switch(type) {
case 0 : {
//判断该队列的缓冲个数是否还只有一个
if(hemq != lemq && hemq->next->next != NULL) {
Returnbuf = hemq->next ; //取得队列头 hemq->next = Returnbuf->next; //修正队列链表头指针的指 向
Returnbuf->next = NULL;
return Returnbuf; } else { //
指针相等级
缓冲池模拟与实现



