2022年操作系统实验--多线程同步

上传人:鲁** 文档编号:567353246 上传时间:2024-07-20 格式:PDF 页数:4 大小:80.69KB
返回 下载 相关 举报
2022年操作系统实验--多线程同步_第1页
第1页 / 共4页
2022年操作系统实验--多线程同步_第2页
第2页 / 共4页
2022年操作系统实验--多线程同步_第3页
第3页 / 共4页
2022年操作系统实验--多线程同步_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《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 页 - - - - - - - - -

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号