模拟生产者 |
您所在的位置:网站首页 › 简述生产者消费者问题的解决方案 › 模拟生产者 |
生产者-消费者问题 一组生产者进程生产产品给一组消费者进程消费。一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得。生产者——消费者问题实际上是相互合作进程关系的一种抽象。该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。 使用一个数组来表示具有n个(0,1,…,n-1)缓冲区的缓冲池。用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,in加1;用一个输出指针out来指示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,out加 1。缓冲池是循环数组。可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。 本实验模拟了生产者——消费者问题,打开“Microsoft Visual C++ 6.0”,输入相关代码后,对程序行进编译运行后,记录运行结果(记录第一个消费者以及其执行前的记录): 根据实验过程,结合实验程序,回答一下问题: 1.程序中创建了几个线程,生产者和消费者线程各几个?线程入口函数是什么? 创建了4个线程。生产者3个,消费者1个。消费者是DWORD WINAPI Consumer(LPVOID); 生产者是DWORD WINAPI Producer(LPVOID); 2.创建了几个信号量,它们的初始状态是什么,它们的作用各是什么? 3个信号量。g_hMutex=NULL、g_hEmptySemaphore=NULL、 g_hFullSemaphore=NULL。 g_hMutex用于线程间的互斥、g_hEmptySemaphore当缓冲区空时迫使消费者等待、g_hFullSemaphore当缓冲区满时迫使生产者等待。 3.简述函数WaitForSingleObject的功能 生产者(消费者)申请空缓冲区(满缓冲区)的使用,等待互斥信号量。 4.简述生产者线程执行的操作 生产者先申请空缓冲区的使用,等待互斥信号量,然后将信号量变为1,然后进行生产,空缓冲区增加一个产品,然后释放互斥信号量,释放满缓冲区。 5.简述消费者线程执行的操作 消费者先申请满缓冲区的使用,等待互斥信号量,然后将信号量变为1,然后进行消费,满缓冲区减少一个产品,然后释放互斥信号量变为0,释放空缓冲区。 附上源代码———— #include #include const unsigned short SIZE_OF_BUFFER = 10; unsigned short ProductID =0; unsigned short ConsumeID=0; unsigned short in =0; unsigned short out =0; int g_buffer[SIZE_OF_BUFFER]; bool g_continue = true; HANDLE g_hEmptySemaphore; HANDLE g_hMutex; HANDLE g_hFullSemaphore; DWORD WINAPI Consumer(LPVOID); DWORD WINAPI Producer(LPVOID); int main(){ g_hMutex=CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); const unsigned short PRODUCERS_COUNT=3; const unsigned short CONSUMERS_COUNT=1; const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreads[THREADS_COUNT]; DWORD producerID[PRODUCERS_COUNT]; DWORD consumerID[CONSUMERS_COUNT]; for (int i=0; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |