- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4.4 线程同步 4.4.5 等待计时器 第4章 多线程基础 等待定时器对象总是在未通知状态中创建。必须调用SetWaitableTimer函数来告诉定时器在何时让它成为已通知状态。 BOOL SetWaitableTimer( HANDLE hTimer, const LARGE_INTEGER* pDueTime, LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, BOOL fResume ); 小结(理论课) 第4章 多线程基础 本节主要讲解Windows系统中线程同步的方法: 全局变量 事件 互斥内核对象 信号量 等待计时器 这是什么意思 小测验(题目部分) 第4章 多线程基础 选择题(多选题) 1.在下列选项中,哪些方法是属于用户态的?( ) A. 互锁函数 B. 事件 C. 信号量 D. 临界区 判断题 2.临界区允许在任意时刻多个线程对共享资源进行访问。 ( ) 3.不同进程中的多个线程可以访问同一个互斥对象。 ( ) 小测验(答案部分) 第4章 多线程基础 选择题(多选题) 1.在下列选项中,哪些方法是属于用户态的?( AD ) A. 互锁函数 B. 事件 C. 信号量 D. 临界区 判断题 2.临界区允许在任意时刻多个线程对共享资源进行访问。 ( 错 ) 3.不同进程中的多个线程可以访问同一个互斥对象。 ( 对 ) 课后作业 第4章 多线程基础 【作业1】分别利用临界区和事件实现线程同步 思路分析:设计一个全局变量,在两个线程中同时对它进行修改,利用临界区和事件,控制对全局变量的修改,保证线程的同步:即线程2需要等待线程1完成操作才能继续进行。 第4章 多线程基础 The End 专业教程 理论讲解部分 网络游戏开发语言基础——Windows程序设计 第4章 多线程基础 第4章 多线程基础 线程同步 线程同步 线程同步 掌握进程同步的基本方式 4.4 线程同步 4.4.1 全局变量 第4章 多线程基础 线程需要在下面两种情况下互相进行通信: 1)当有多个线程访问共享资源而不使资源被破坏时; 2)当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。 4.4 线程同步 4.4.1 全局变量 1. 互锁函数 第4章 多线程基础 线程同步问题在很大程度上与原子访问有关,所谓原子访问,是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。 示例 long g_nValue = 0; DWORD WINAPI Thread1(LPVOID lpParam) { g_nValue++; return 0; } DWORD WINAPI Thread2(LPVOID lpParam) { g_nValue++; return 0; } 4.4 线程同步 4.4.1 全局变量 1. 互锁函数 第4章 多线程基础 Windows是个抢占式多线程环境,一个线程可以随时中断运行,而另一个线程则可以随时继续执行。因此,上述代码可能执行如下: MOV EAX,[g_nValue] INC EAX MOV EAX,[g_nValue] INC EAX MOV [g_nValue], EAX MOV [g_nValue], EAX 最终结果是变量只增加了1 4.4 线程同步 4.4.1 全局变量 1. 互锁函数 第4章 多线程基础 所有的互锁函数都能以原子的方式对一个数进行操作。 LONG InterlockedExchangeAdd( LONG volatile* Addend, //要修改的变量的指针 LONG Value //要增加的值 ); 互锁函数有很多,可以根据不同需要选择相应的函数 4.4 线程同步 4.4.1 全局变量 1. 互锁函数 第4章 多线程基础 long g_nValue = 0; DWORD WINAPI Thread1(PVOID pvParam) { InterlockedExchangeAdd(g_nValue,1); return 0; } DWORD WINAPI Thread2(PVOID pvParam) { InterlockedExchangeAdd(g_nValue,1); return 0; } 示例 4.4 线程同步 4.4.1 全局变量 2.volatile关键字 第4章 多线程基础 由于线程优先级的原因,会导致出现死锁现象。 bool g_bFinishedCalculat
原创力文档


文档评论(0)