#include "windows.h"
#include "iostream.h"
#include "math.h"
#define random (rand()*10000)/RAND_MAX //定义一个随机函数来生产产品,并且使两个顾产品间的时间少于10秒 int long waiting(0); //正在等待的产品的数目
int buffer; //空位的总数目
char empty; //缓冲区空
char full; //缓冲区满
int count(0); //产品的号码数
int finish(0); //生产完毕的产品数目
DWORD a;
void proceduce()
{
Sleep (10000);
cout<<"缓冲区已空 !"<<endl; //生产者生产产品函数,用时10秒
}
void getconsu***eep (10001); //产品被生产的函数,为了合理区分生产产品
cout<<"第"<<finish<<"个产品被消费,取出 "<<endl;
}
HANDLE Mutex=CreateMutex(NULL, FALSE, "Mutex"); //用来实现进程的互斥
HANDLE proceducer=CreateSemaphore(NULL, 1,1, "proceducer");//定义信号量来进行线程间的同步
HANDLE consumer=CreateSemaphore(NULL,0,3,"consum");
DWORD WINAPI consum(LPVOID pParm2) //消费的线程
{
WaitForSingleObject(Mutex ,INFINITE); //p(mutex)来进行互斥操作
count++; //生产的是第几个产品
cout<<"第 "<<count<<" 个产品生产了 "<<endl;
if (waiting<buffer) //如果缓冲池还有空位
{
if (waiting!=0)
{
cout<<"此时有"<<waiting+1 <<" 个产品等待消费"<<endl;
}
else
cout<<"没有产品在等待"<<endl; //输出有多少人在等待
waiting++;
cout<<"还有"<<buffer-waiting<<"个空位"<<endl;
cout<<"有空区,产品已经进入"<<endl;
ReleaseSemaphore(consum,1,NULL);//v(consumer)
ResumeThread(consum);//唤醒生产者进程
ReleaseMutex(Mutex);//释放互斥量,以便其他线程使用
WaitForSingleObject(proceducer,INFINITE);//等待生产
getconsum(); //消费并取走
}
else
{
cout<<"缓冲区已满,第"<<count<<"个产品暂停生产"<<endl; //没有空位,生产者不再生产
ReleaseMutex(Mutex);
}
return 0;
}
DWORD WINAPI proceducers(LPVOID pParm1) //生产者的线程
{
while(true) //一直执行
{
WaitForSingleObject(consum,INFINITE);//p(customers),等待产品
WaitForSingleObject(Mutex,INFINITE); //等待互斥量
waiting--; //等待的产品数减一
ReleaseSemaphore(proceducer,1,NULL); //释放信号量
ResumeThread(proceducer); //唤醒消费进程
ReleaseMutex(Mutex); //v(mutex);
proceduce(); //生产
finish++; //消费的产品数加1
}
return 0;
}
int main(int argc, char* argv[])
{
cout<<"请输入缓冲区空位的总数目:";
cin>>buffer;
cout<<"缓冲区共有"<<buffer<<"个空位"<<endl; //设置缓冲区空位数目
cout<<"缓冲区空生产产品吗?Y/N"<<endl; //缓冲区是否空
cin>>empty;
while (empty!='y')
{
cout<<endl<<"********对不起,缓冲区满!********"<<endl;
cout<<"缓冲区已空,生产产品?Y/N"<<endl;
cin>>empty;
}
HANDLE hThread1;
HANDLE hThread2;
hThread2=::CreateThread (NULL,0,proceducers,NULL,0,NULL); //产生一个生产者进程
while(full!='y')
{
Sleep(random); //产品随机进入
hThread1=::CreateThread(NULL,0,consum,NULL,a,NULL);
cout<<endl<<"********缓冲区已空,请继续生产********"<<endl;
if (finish>=10&&waiting==0) //如果完成数超过10并且没有人等待
{
cout<<"已经为"<<finish<<"个产品了,要停止生产吗?"<<endl; //提示是否关门
cin>>full;
return full;
}
else ;
}
if (full=='y')
{
cout<<"********对不起,缓冲区已满********"<<endl;
return 0;
}
}
是某学长写的,在网上找到的,写的真心好。
发出来大家看看吧,有兴趣提升的可以研究研究。
找到这个程序最关键的点,列出精华代码,当buffer=1时,程序是怎样运行的。