操作系统之生产者消费者问题(c++实现)(2)

2019-06-11 16:52

HANDLE hThreads[PRODUCERS_COUNT];//各线程的 handle DWORD producerID[CONSUMERS_COUNT];//生产者线程的标识符 DWORD consumerID[THREADS_COUNT];//消费者线程的标识符 /*----------------------------程序提示信息开始------------------------------*/ void info()//程序提示信息 {

std::cout<<\

std::cout<<\课程设计课题 : 生产者-消费者问题的模拟实现 |\std::cout<<\指 导 老 师 : 李先锋 |\std::cout<<\学 生 : 丁可 |\std::cout<<\班 级 : B计123班 |\std::cout<<\std::cout<<\》按回车开始该程序 \getchar(); }

/*----------------------------程序提示信息结束------------------------------*/ /*----------------------------生产一个产品开始------------------------------*/ //生产一个产品:输出其 ID 号 void Produce() {

std::cout<

std::cerr<<\生产一个产品: \std::cout<

/*----------------------------生产一个产品结束------------------------------*/ /*----------------------把新生产的产品放入缓冲区开------------------------*/ //把新生产的产品放入缓冲区 void Append() {

std::cerr<<\把生产的产品送入缓冲区\g_buffer[in]=ProductID;

in=(in+1)%SIZE_OF_BUFFER; std::cerr<

std::cout<<\缓冲区 产品 生产者/消费者\//新产品放入缓冲区后?输出缓冲区当前的状态 for(int i=0;i

//输出缓冲区下标 if (i<10)

std::cout<

std::cout<

{

if(g_buffer[i]<10) std::cout<<\else

std::cout<<\

std::cout<<\生产者\输出生产者的指针位置 }

if(i==out) {

if(g_buffer[i]<10) std::cout<<\else

std::cout<<\

std::cout<<\消费者\输出消费者的指针位置 }

std::cout<

/*----------------------把新生产的产品放入缓冲区结------------------------*/ /*----------------------------消费一个产品开始------------------------------*/ void Consume()//消费一个产品 {

std::cout<

std::cerr<<\消费一个产品: \std::cout<

/*----------------------------消费一个产品结束------------------------------*/ /*-----------------------从缓冲区中取出一个产品开始-------------------------*/ //从缓冲区中取出一个产品 void Take() {

std::cout<

std::cerr<<\从缓冲区取出一个产品\ConsumeID=g_buffer[out];

out=(out+1)%SIZE_OF_BUFFER; std::cerr<

std::cout<<\缓冲区 产品 生产者/消费者\//取出一个产品后:输出缓冲区当前的状态 for(int i=0;i

//输出缓冲区下标 if(i<10)

std::cout<

std::cout<

if(i==in) {

if(g_buffer[i]<10) std::cout<<\else

std::cout<<\

std::cout<<\生产者\输出生产者的指针位置 }

if(i==out) {

if(g_buffer[i]<10) std::cout<<\else

std::cout<<\

std::cout<<\消费者\输出消费者的指针位置 }

std::cout<

/*-----------------------从缓冲区中取出一个产品结束-------------------------*/ /*-----------------------------生产者线程开始-------------------------------*/

//生产者线程

DWORD WINAPI Producer(LPVOID lpPara) {

while(g_continue) {

//资源信号量的 P 操作

WaitForSingleObject(g_hFullSemaphore,INFINITE); //互斥信号量的 P 操作

WaitForSingleObject(g_hMutex,INFINITE); //生产一个产品 Produce();

//把新生产的产品放入缓冲区 Append(); Sleep(2000);

//互斥信号量的 V 操作 ReleaseMutex(g_hMutex); //资源信号量的 V 操作

ReleaseSemaphore(g_hEmptySemaphore,1,NULL); }

return 0; }

/*-----------------------------生产者线程结束-------------------------------*/ /*-----------------------------消费者线程开始-------------------------------*/ //消费者线程

DWORD WINAPI Consumer(LPVOID lpPara) {

while(g_continue) {

//资源信号量的 P 操作

WaitForSingleObject(g_hEmptySemaphore,INFINITE); //互斥信号量的 P 操作

WaitForSingleObject(g_hMutex,INFINITE); //从缓冲区中取出一个产品

Take();

//消费一个产品 Consume(); Sleep(2000);

//互斥信号量的 V 操作 ReleaseMutex(g_hMutex); //资源信号量的 V 操作

ReleaseSemaphore(g_hFullSemaphore,1,NULL); }

return 0; }

/*-----------------------------消费者线程结束-------------------------------*/ /*---------------------------创建生产者线程开始-----------------------------*/ void createPT()//创建生产者线程 {

for(int i=0;i

hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]); if(hThreads[i]==NULL) g_continue=0; } }

/*---------------------------创建生产者线程结束-----------------------------*/ /*---------------------------创建消费者线程开始-----------------------------*/

void createCT()//创建消费者线程 {

for (int j=0;j

hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]);

if (hThreads[j]==NULL)

g_continue=0; } }

/*---------------------------创建消费者线程结束-----------------------------*/

/*-------------------------------主函数开始---------------------------------*/ int main() {

//显示程序提示信息 info();

//创建互斥信号量

g_hMutex=CreateMutex(NULL,FALSE,NULL); //创建资源信号量

g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);

g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); //创建生产者线程 createPT();

//创建消费者线程 createCT();

//不按回车键的话程序会一直运行下去 while(g_continue) //按回车键终止程序 if(getchar())

g_continue = 0; return g_continue; }

5、设计小结

(本设计的特色、经验教训和体会等)

6、参考文献

(参考的书籍等,列出书名、作者、出版社及出版时间等,例如:

[1]计算机操作系统(第3版),汤小丹,西安电子科技大学出版社,2007年7月 [2]C语言程序设计,孟庆昌,人民邮电出版社,2006年4月

报告各部分内容根据设计的具体情况自行扩展。


操作系统之生产者消费者问题(c++实现)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2013年国家二级VB最新新题库

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: