《2022年操作系统实验--多线程同步》由会员分享,可在线阅读,更多相关《2022年操作系统实验--多线程同步(4页珍藏版)》请在金锄头文库上搜索。
1、一、实验目的和内容1、实验目的在掌握基于消息的windows 程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。 使学生能够从程序设计的角度了解多线程程序设计的方法和在windows 系统下多线程同步互斥的机制。2、实验内容理解 Windows 程序设计的基本思想,理解基于消息的程序设计方法,能够设计出简单的基于事件的windows 程序,完成基本控件的使用结合操作系统中信号量与互斥体的概念,在MFC 中找到对应的相关类。设计一个多线程同步的程序。二、实验方案1、定义相关的信息,创建生产者和消费者线程。设定生产和消费的规则,初步设定没生产两个产品就将其中一个取出消费。2、设定一个
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; /用于
3、线程间的互斥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; H
4、ANDLE hThreadsPRODUCERS_COUNT; / 各线程的 handle DWORD producerIDCONSUMERS_COUNT; / 生产者线程的标识符DWORD consumerIDTHREADS_COUNT; / 消费者线程的标识符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - void Produce() cout 正在生产第 +ProductID 号产品 ; cout 生产成功 endl; vo
5、id 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_B
6、UFFER; 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); Wai
7、tForSingleObject(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(
8、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= CreateSema
9、phore(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) hThread
10、sPRODUCERS_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 页 - - - - - - - - -