VC++高手进~~!急急急!!!
进程同步模拟设计——生产者和消费者问题!要用VC++语言编程序代码,任务就要交了,请VC++高手帮忙,简单点实现就行,小弟先谢过啦~~!有必要的注释最好,最好能是自己编的...
进程同步模拟设计——生产者和消费者问题!要用VC++语言编程序代码,任务就要交了,请VC++高手帮忙,简单点实现就行,小弟先谢过啦~~!有必要的注释最好,最好能是自己编的,完成任务额外再追加奖励50分,大家帮忙啦~~!
展开
3个回答
展开全部
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。本作业要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
本作业要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。你需要使用如下信号量:
l 一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;
l 一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;
l 一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;
/*采用多线程模拟生产者消费者问题*/
/*GS0821125 XuChuanming*/
/*2008-11-28*/
#include <iostream>
#include <windows.h>
using namespace std;
const int BUFFER_SIZE=5; //定义缓冲区长度
int ProductID=0; //产品编号
int ConsumeID=0; //被消耗的产品号
int in=0; //产品进缓冲区时的缓冲区下标
int out=0; //产品出缓冲区时的缓冲区下标
int g_buffer[BUFFER_SIZE]; //缓冲区,用一数组表示
bool g_continue=true; //控制程序结束
HANDLE g_hMutex; //互斥信号量,用来保护临界区
HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待
void Produce() //生产一个产品
{
cout<<"生产者生产第 "<<++ProductID<< " 个产品 ";
cout<<"成功~"<<endl;
}
void Consume() //消费一个产品
{
cout<<"消费者买走第 "<<ConsumeID<<" 个产品 "<<endl;
}
void PutIn() //模拟把新生产的产品放入缓冲区
{
g_buffer[in]=ProductID;
in=(in+1)%BUFFER_SIZE; //取模循环使用
}
void TakeOut() //模拟从缓冲区中取出一个产品
{
ConsumeID=g_buffer[out];
out=(out+1)%BUFFER_SIZE;
}
DWORD WINAPI Producer(LPVOID lpPara) //生产者
{
while(g_continue)
{
//P操作
WaitForSingleObject(g_hFullSemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
/*-----------------临界区-----------------*/
Produce();
PutIn();
Sleep(1000);
/*-----------------临界区-----------------*/
//v操作
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
}
return 0;
}
DWORD WINAPI Consumer(LPVOID lpPara) //消费者
{
while(g_continue)
{
//P操作
WaitForSingleObject(g_hEmptySemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
/*-----------------临界区-----------------*/
TakeOut();
Consume();
Sleep(1000);
/*-----------------临界区-----------------*/
//v操作
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hFullSemaphore,1,NULL);
}
return 0;
}
int main()
{
g_hMutex=CreateMutex(NULL,FALSE,NULL); //创建互斥信号量
g_hFullSemaphore=CreateSemaphore(NULL,BUFFER_SIZE-1,BUFFER_SIZE-1,NULL);
g_hEmptySemaphore=CreateSemaphore(NULL,0,BUFFER_SIZE-1,NULL);
int PRODUCERS_COUNT=2; //生产者的个数
int CONSUMERS_COUNT=3; //消费者的个数
int THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT; //总的线程数
HANDLE hThreads[PRODUCERS_COUNT];
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符
DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符
for(int i=0;i<PRODUCERS_COUNT;++i) //创建生产者线程
{
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
if (hThreads[i]==NULL) return -1;
}
for (int i=0;i<CONSUMERS_COUNT;++i) //创建消费者线程
{
hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);
if (hThreads[i]==NULL) return -1;
}
bool procStop=true;//控制程序结束
while(procStop)
{
if(getchar())procStop=false;
}
if(procStop==false)
system("pause");
return(0);
}
自己改改就可以用了。
本作业要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。你需要使用如下信号量:
l 一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;
l 一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;
l 一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;
/*采用多线程模拟生产者消费者问题*/
/*GS0821125 XuChuanming*/
/*2008-11-28*/
#include <iostream>
#include <windows.h>
using namespace std;
const int BUFFER_SIZE=5; //定义缓冲区长度
int ProductID=0; //产品编号
int ConsumeID=0; //被消耗的产品号
int in=0; //产品进缓冲区时的缓冲区下标
int out=0; //产品出缓冲区时的缓冲区下标
int g_buffer[BUFFER_SIZE]; //缓冲区,用一数组表示
bool g_continue=true; //控制程序结束
HANDLE g_hMutex; //互斥信号量,用来保护临界区
HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待
void Produce() //生产一个产品
{
cout<<"生产者生产第 "<<++ProductID<< " 个产品 ";
cout<<"成功~"<<endl;
}
void Consume() //消费一个产品
{
cout<<"消费者买走第 "<<ConsumeID<<" 个产品 "<<endl;
}
void PutIn() //模拟把新生产的产品放入缓冲区
{
g_buffer[in]=ProductID;
in=(in+1)%BUFFER_SIZE; //取模循环使用
}
void TakeOut() //模拟从缓冲区中取出一个产品
{
ConsumeID=g_buffer[out];
out=(out+1)%BUFFER_SIZE;
}
DWORD WINAPI Producer(LPVOID lpPara) //生产者
{
while(g_continue)
{
//P操作
WaitForSingleObject(g_hFullSemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
/*-----------------临界区-----------------*/
Produce();
PutIn();
Sleep(1000);
/*-----------------临界区-----------------*/
//v操作
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
}
return 0;
}
DWORD WINAPI Consumer(LPVOID lpPara) //消费者
{
while(g_continue)
{
//P操作
WaitForSingleObject(g_hEmptySemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
/*-----------------临界区-----------------*/
TakeOut();
Consume();
Sleep(1000);
/*-----------------临界区-----------------*/
//v操作
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hFullSemaphore,1,NULL);
}
return 0;
}
int main()
{
g_hMutex=CreateMutex(NULL,FALSE,NULL); //创建互斥信号量
g_hFullSemaphore=CreateSemaphore(NULL,BUFFER_SIZE-1,BUFFER_SIZE-1,NULL);
g_hEmptySemaphore=CreateSemaphore(NULL,0,BUFFER_SIZE-1,NULL);
int PRODUCERS_COUNT=2; //生产者的个数
int CONSUMERS_COUNT=3; //消费者的个数
int THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT; //总的线程数
HANDLE hThreads[PRODUCERS_COUNT];
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符
DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符
for(int i=0;i<PRODUCERS_COUNT;++i) //创建生产者线程
{
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
if (hThreads[i]==NULL) return -1;
}
for (int i=0;i<CONSUMERS_COUNT;++i) //创建消费者线程
{
hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);
if (hThreads[i]==NULL) return -1;
}
bool procStop=true;//控制程序结束
while(procStop)
{
if(getchar())procStop=false;
}
if(procStop==false)
system("pause");
return(0);
}
自己改改就可以用了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询