2022年操作系统实验--多线程同步 .pdf
一、实验目的和内容1、实验目的在掌握基于消息的windows 程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。使学生能够从程序设计的角度了解多线程程序设计的方法和在windows 系统下多线程同步互斥的机制。2、实验内容理解 Windows 程序设计的基本思想,理解基于消息的程序设计方法,能够设计出简单的基于事件的windows 程序,完成基本控件的使用结合操作系统中信号量与互斥体的概念,在MFC 中找到对应的相关类。设计一个多线程同步的程序。二、实验方案1、定义相关的信息,创建生产者和消费者线程。设定生产和消费的规则,初步设定没生产两个产品就将其中一个取出消费。2、设定一个循环队列,作为缓冲区,设计生产者消费者算法。3、使用互斥的思路,当缓冲区满时迫使生产者等待,当缓冲区空时迫使消费者等待。4、源代码#include#include using namespace std;unsigned short ProductID=0,ConsumeID=0,in=0,out=0;const unsigned short SIZE_OF_BUFFER=10;/缓冲区长度int g_bufferSIZE_OF_BUFFER;/缓冲区是个循环队列bool g_continue=true;/控制程序结束HANDLE g_hMutex;/用于线程间的互斥HANDLE g_hFullSemaphore;HANDLE g_hEmptySemaphore;DWORD WINAPI Producer(LPVOID);/生产者线程DWORD WINAPI Consumer(LPVOID);/消费者线程const unsigned short PRODUCERS_COUNT=2;/生产者的个数const unsigned short CONSUMERS_COUNT=1;/消费者的个数const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreadsPRODUCERS_COUNT;/各线程的 handle DWORD producerIDCONSUMERS_COUNT;/生产者线程的标识符DWORD consumerIDTHREADS_COUNT;/消费者线程的标识符名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 4 页 -void Produce()cout 正在生产第 +ProductID 号产品 ;cout 生产成功 endl;void Append()cout 存放新产品 ;g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;cout 成功 endl;cout缓冲区情况 endl;for(int i=0;iSIZE_OF_BUFFER;+i)cout i:g_bufferi;if(i=in)cout -生产;if(i=out)cout -消费;cout endl;coutendl;void Take()cout 取出一个产品 ;ConsumeID=g_bufferout;out=(out+1)%SIZE_OF_BUFFER;cout 成功 endl;for(int i=0;iSIZE_OF_BUFFER;+i)cout i:g_bufferi;if(i=in)cout -生产;if(i=out)cout -消费;cout endl;coutendl;void Consume()cout 消费第 ConsumeID 号产品;cout 成功 endl;DWORD WINAPI Producer(LPVOID lpPara)while(g_continue)WaitForSingleObject(g_hFullSemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Produce();名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 4 页 -Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;DWORD WINAPI Consumer(LPVOID lpPara)while(g_continue)WaitForSingleObject(g_hEmptySemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(2000);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);return 0;int main()/创建各个互斥信号 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);/创建生产者线程 for(int i=0;iPRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL)return-1;/创建消费者线程for(i=0;iCONSUMERS_COUNT;+i)hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi);if(hThreadsi=NULL)return-1;while(g_continue)if(getchar()g_continue=false;/按回车后终止程序运行 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 4 页 -return 0;三、实验数据、结果分析运行结果四、总结名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 4 页 -