- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
PAGE12
《多核程序设计》实验指导书之二
实验2.1Windows32ThreadAPI线程程序设计
实验目的
1.掌握Windows32ThreadAPI特点和基本使用方法;
2.掌握如何采用Windows32ThreadAPI将串行程序转换成多线程程序;
3.掌握Windows32ThreadAPI中互斥机制的使用方式;
实验要求
1.熟练掌握C++语言;
2、掌握VisualStudio*.NET*集成开发环境的使用;
3、掌握Windows32ThreadAPI开发多线程程序;
4、掌握Windows32ThreadAPI中互斥机制的使用方式
实验内容
1.新建一个Win32控制台应用程序,附加选项选择空项目,添加一个源文件,将2-1文件夹里HelloThreads下的main.cpp的内容拷贝到源文件中;
2.对main.cpp中函数进行修改,要求输出线程创建顺序(例如:HelloThread0,HelloThread1,HelloThread2等等);
注意:利用CreateThread()循环变量作为每个线程的执行顺序唯一标识
3.编译并多次运行程序,记录线程执行顺序,分析线程程序执行顺序是否不可预见及其产生原因
4.将2-1文件夹里Pi.cpp的代码拷贝到一个项目中,编译并运行程序;
5.对此串行代码使用Windows32ThreadAPI进行线程化,要求4线程实现,且每次迭代计算仅由一个线程完成;
6.使用CRITICAL_SECTION机制和Semaphors机制对多线程共享变量进行互斥操作,避免数据竞争。
本实验我们要学习windows多线程编程的基本知识,如线程创建、线程等待等,同时要掌握如何使用win32的线程同步机制来实现线程的同步。
创建线程:
HANDLECreateThread{
LPSECURITY_ATTRIBUTESlpThreadAttributes,
SIZE_TdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress,
LPVOIDlpParameter,
DWORD dwCreationFlags,
LPDWORDlpThreadId
};
参数
lpThreadAttrubutes 描述施行于这一新线程的security属性,NULL表示使用缺省值
dwStackSize 新线程初始的保留堆栈的大小,0表示使用缺省大小:1MB
lpStartAddress 新线程将开始的起始地址,这是一个函数指针
lpParameter 此值将被传送到上述所指定之新线程函数去,作为参数
dwCreationFlags 产生一个暂时挂起的线程,为0表示“立即开始执行”
lpThreadId 新线程的ID会被传回到这里
线程等待:
DWORDWaitForMultipleObject(DWORDnCount,
CONSTHANDLE*lpHandle,
BOOLbWaitAll,
DWORDdwMilliseconds);
该函数可以用来同时监测多个对象
参数
nCount 表示lpHandle所指之handles数组的元素个数
lpHandle 指向一个由对象handles所组成的数组,这些handles不需要为相同的类型
bWaitAll bWaitAll为true时,表示所有的handles都必须激发函数才返回,否则此函数将在任何一个handle激发时就返回
dwMilliseconds 表示一个时间长度,当该时间长度达到时,即使没有任何handles激发,此函数也会返回。可设置为0或INFINITE
Win32线程同步实现
全局变量
事件:当程序中一个线程的运行需要等待另外一个线程中一项特定操作的完成才能继续执行时,就可以使用事件对象来通知等待线程某个条件已满足;
临界区:临界区是一种防止多个线程同时执行一个特定代码段的机制如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程奖被挂起,并一直持续到进入临界区的线程离开临界区使用于多个线程操作之间没有先后顺序但要求互斥的同步。在进程使用之前调用如下函数对对象进行初始化:
VOIDInitializeCriticalSection(LPCRITICAL_SECTION);
当一个线程使用临界区时,调用函数EnterCriticalSection或者TryEnterCriticalSection;
当要求占用、退出临界区时,调用函数LeaveCriticalSection,释放对临界区对象的占用
您可能关注的文档
最近下载
- 2024华医网继续教育糖尿病及其并发症诊疗新进展题库答案.docx VIP
- 小红书种草学2024母婴食品行业-成长有营养种草促增长.pdf
- SMTC 3 800 006 电子电器零件系统电磁兼容测试规范General test specification of electromagnetic compatibility for electrical-electronic components and subsystems(20200929).pdf
- 2021年传染病防治知识试题及答案.pdf
- 2024执业药师继续教育甲状腺疾病的药物治疗参考答案.docx
- 上市新药达洛鲁胺(Darolutamide)合成检索总结报告.pdf VIP
- 高等数学教学教案.doc VIP
- 国开本科《理工英语3》机考题库及答案.docx
- 定比点差法专题(学生版).pdf
- [运维]-数据中心机房基础设施运维管理规范.docx VIP
文档评论(0)