下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络游戏开发语言基础
——Windows程序设计第4章多线程基础第4章多线程基础线程同步线程同步线程同步掌握进程同步的基本方式4.4线程同步4.4.1全局变量线程需要在下面两种情况下互相进行通信:1)当有多个线程访问共享资源而不使资源被破坏时;2)当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。第4章多线程基础4.4线程同步4.4.1全局变量1.互锁函数线程同步问题在很大程度上与原子访问有关,所谓原子访问,是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。示例longg_nValue=0;DWORDWINAPIThread1(LPVOIDlpParam){ g_nValue++; return0;}DWORDWINAPIThread2(LPVOIDlpParam){ g_nValue++; return0;}第4章多线程基础4.4线程同步4.4.1全局变量1.互锁函数Windows是个抢占式多线程环境,一个线程可以随时中断运行,而另一个线程则可以随时继续执行。因此,上述代码可能执行如下: MOVEAX,[g_nValue] INCEAX MOVEAX,[g_nValue] INCEAX MOV[g_nValue],EAX MOV[g_nValue],EAX最终结果是变量只增加了1第4章多线程基础4.4线程同步4.4.1全局变量1.互锁函数所有的互锁函数都能以原子的方式对一个数进行操作。LONGInterlockedExchangeAdd(LONGvolatile*Addend,//要修改的变量的指针
LONGValue //要增加的值);互锁函数有很多,可以根据不同需要选择相应的函数第4章多线程基础4.4线程同步4.4.1全局变量1.互锁函数longg_nValue=0;DWORDWINAPIThread1(PVOIDpvParam){ InterlockedExchangeAdd(&g_nValue,1); return0;}DWORDWINAPIThread2(PVOIDpvParam){ InterlockedExchangeAdd(&g_nValue,1); return0;}示例第4章多线程基础4.4线程同步4.4.1全局变量2.volatile关键字由于线程优先级的原因,会导致出现死锁现象。boolg_bFinishedCalculation=false;intWINAPIWinMain(...){ CreateThread(...,RecalcFun,...); while(!g_bFinishedCalculation){...;}}DWORDWINAPIRecaluFun(PVOIDpvParam){ g_bFinishedCalculation=true; return0;}示例第4章多线程基础4.4线程同步4.4.1全局变量2.volatile关键字在声明全局变量时,增加关键字volatile。关键字volatile的作用是告诉编译器,变量可以被应用程序本身以外的某个对象进行修改,volatile限定词会告诉编译器,不要对该变量进行任何优化,并且总是重新加载来自该变量的内存单元的值。volatileboolg_bFinishedCalculation=false;示例第4章多线程基础4.4线程同步4.4.1全局变量3.临界区临界区工作原理声明临界区变量变量是否被修改线程挂起线程执行否是第4章多线程基础4.4线程同步4.4.1全局变量3.临界区实现步骤:声明临界区变量CRITICAL_SECTIONg_cs;在线程函数中检测临界区变量DWORDWINAPIFirstThread(PVOIDpvParam){ EnterCriticalSection(&g_cs); …… LeaveCriticalSection(&g_cs); }}第4章多线程基础4.4线程同步4.4.2事件1.通知状态事件是基于内核对象的同步机制。进程和线程也属于内核对象,可以用于同步的目的。对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中。这种状态的切换是由系统为每个对象建立的一套规则来决定的。当进程正在运行的时候,进程内核对象处于未通知状态,当进程终止运行的时候,它就变为已通知状态。第4章多线程基础4.4线程同步4.4.2事件1.通知状态当线程等待的对象处于未通知状态中时,这些线程不可调度。但是一旦对象变为已通知状态,线程看到该标志后就会变为可调度状态,并且很快恢复运行。第4章多线程基础4.4线程同步4.4.2事件2.等待函数等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。DWORDWaitForSingleObject(HANDLEhHandle, //内核对象句柄
DWORDdwMilliseconds //等待时间,以毫秒为单位);示例WaitForSingleObject(hProcess,INFINITE);调用函数准备等待到hProcess句柄标识的进程终止运行为止,第2个参数告诉系统,调用线程愿意永远等待下去(无限时间量),直到该进程终止运行。第4章多线程基础4.4线程同步4.4.2事件3.事件内核对象事件内核对象是个最基本的对象。它们包含一个使用计数(与所有内核对象一样),一个用于指明该事件是个自动重置的事件还是一个人工重置事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。事件能够通知一个操作已经完成。有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。第4章多线程基础4.4线程同步4.4.2事件3.事件内核对象CreateEvent函数用于创建事件内核对象。HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,//设置安全性BOOLbManualReset, //自动事件还是手动事件BOOLbInitialState, //事件的初始化值LPCTSTRlpName //事件内核对象的名称);第4章多线程基础4.4线程同步4.4.2事件3.事件内核对象得到事件内核对象后,可以设置它的值。BOOLSetEvent(HANDLEhEvent //事件对象的句柄);修改事件为已通知状态BOOLResetEvent(HANDLEhEvent //事件对象的句柄);修改事件为未通知状态第4章多线程基础4.4线程同步4.4.2事件3.事件内核对象intWINAPIWinMain(...){ g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); HANDLEhThread[3]; DWORDdwThreadID; hThread[0]=_beginthreadex(NULL,0,WordCount, NULL,0,dwThreadID); …... SetEvent(g_hEvent);}示例在主线程中创建事件,设为已通知状态。第4章多线程基础4.4线程同步4.4.2事件3.事件内核对象DWORDWINAPIWordCount(PVOIDpvParam){ WaitForSingleObject(g_hEvent,INFINITE); ...//做相关工作
SetEvent(g_hEvent); return0;}示例在各个子线程中等待事件通知,完成后修改事件,设为已通知状态。第4章多线程基础4.4线程同步4.4.3互斥内核对象互斥(mutex)内核对象能够确保线程拥有对单个资源的互斥访问权。互斥对象包含一个使用数量,一个线程ID和一个递归计数器。互斥对象的行为特性与临界区相同,但是互斥对象属于内核对象,而临界区则属于用户方式对象。ID用于标识系统中的哪个线程当前拥有互斥对象,递归计数器用于指明该线程拥有互斥对象的次数。第4章多线程基础4.4线程同步4.4.3互斥内核对象互斥对象的使用规则如下:如果线程ID是0(这是个无效ID),互斥对象不被任何线程所拥有,并且发出该互斥对象的通知信号;如果ID是个非0数字,那么一个线程就拥有互斥对象,并且不发出该互斥对象的通知信号;与所有其他内核对象不同,互斥对象在操作系统中拥有特殊的代码,允许它们违反正常的规则。第4章多线程基础4.4线程同步4.4.3互斥内核对象函数CreateMutex用于创建互斥对象:HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,//安全特性结构
BOOLbInitialOwner, //初始状态
LPCTSTRlpName //互斥对象的名字字符串指针);bInitialOwner参数用于控制互斥对象的初始状态。如果传递FALSE,那么互斥对象的ID和递归计数器均被设置为0。如果为bInitialOwner参数传递TRUE,那么该对象的线程ID被设置为调用线程的ID,递归计数器被设置为1。第4章多线程基础4.4线程同步4.4.3互斥内核对象通过调用ReleaseMutex函数,可以释放当前进程(线程)对mutex对象的拥有权。BOOLReleaseMutex(HANDLE
hMutex
);
第4章多线程基础4.4线程同步4.4.3互斥内核对象通过调用一个等待函数,并传递负责保护资源的互斥对象的句柄,线程就能够获得对共享资源的访问权。在内部,等待函数要检查线程的ID,以了解它是否是0(互斥对象发出通知信号)。如果线程ID是0,那么该线程ID被设置为调用线程的ID,递归计数器被设置为1,同时,调用线程保持可调度状态。如果等待函数发现ID不是0(不发出互斥对象的通知信号),那么调用线程便进入等待状态。系统将记住这个情况,并且在互斥对象的ID重新设置为0时,将线程ID设置为等待状态中的线程ID,将递归计数器设置为1,并且允许等待线程再次成为可调度线程。第4章多线程基础4.4线程同步4.4.4信号量信号量内核对象用于对资源进行计数。它们与所有内核对象一样,包含一个使用数量,但是它们也包含另外两个带符号的32位值,一个是最大资源数量,一个是当前资源数量。信号量可以用于线程池技术。线程池线程池是多线程开发中为了避免频繁的创建和撤消线程,而采用的一种线程管理技术。它采用一组固定的线程交替执行相关的任务,减少了由于创建线程和撤消线程引起的各种时间和空间上的开销,提高了程序的执行效率。第4章多线程基础4.4线程同步4.4.4信号量信号量的使用规则如下:1)如果当前资源的数量大于0,则发出信标信号;2)如果当前资源数量是0,则不发出信标信号;3)系统决不允许当前资源的数量为负值;4)当前资源数量决不能大于最大资源数量。第4章多线程基础4.4线程同步4.4.4信号量可以调用CreateSemaphore函数来创建信号量。HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,//安全属性结构
LONGlInitialCount,//初始化时的资源数量
LONGlMaximumCount,//最大的资源数量
LPCTSTRlpName//信号量的名字字符串);第4章多线程基础4.4线程同步4.4.4信号量通过调用ReleaseSemaphore函数,来释放对于当前信号量的占用,并且初始化下一次信号量的数量(受创建时信号量的总数限制)。BOOLReleaseSemaphore(
HANDLEhSemaphore,LONGlReleaseCount,LPLONGlpPreviousCount
);
第4章多线程基础4.4线程同步4.4.5等待计时器等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象。HANDLECreateWaitableTimer(LPSECURITY_ATTRIBUTESlpTimerAttributes,BOOLbManualReset,LPCTSTRlpTimerName);若要创建等待定时器,只需要调用CreateWaitableTimer函数。第4章多线程基础4.4线程同步4.4.5等待计时器等待定时器对象总是在未通知状态中创建。必须调用SetWaitableTimer函数来告诉定时器在何时让它成为已通知状态。BOOLSetWaitableTimer(HANDLEhTimer,constLARGE_INTEGER*pDueTime,LONGlPeriod,PTIMERAPCROUTINEpletionRoutine,LPVOIDpletionRoutine,BOOLfResume
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山东省职教高考《职测》核心考点必刷必练试题库(含答案)
- 《乡村振兴促进法》参考试题库80题(含答案)
- 《公务员法》考试题库500题(含答案)
- 2025年江苏农林职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 预防与解决劳动纠纷
- 人工智能应用开发合同
- 幼儿园纸张活动策划方案模板五篇
- 建筑施工合同管理培训.x
- 租赁房屋租赁合同
- 企业业务咨询服务简单合同
- 2023年四川省公务员录用考试《行测》真题卷及答案解析
- 机电一体化系统设计-第5章-特性分析
- 2025年高考物理复习压轴题:电磁感应综合问题(原卷版)
- 铸铝焊接工艺
- 《社区康复》课件-第六章 骨关节疾病、损伤患者的社区康复实践
- 2024年湖南省公务员考试行政职业能力测验真题
- 攀岩运动之绳结技巧课程
- 防打架殴斗安全教育课件
- 采购行业的swot分析
- 石家庄长安区幼儿园信息统计表
- 最终稿(教学评一致)课件
评论
0/150
提交评论