- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络编程第5讲:线程同步机制
网络编程 – 第五讲 线程同步机制 主要内容: 第一部分 线程同步概述 第二部分 线程同步方法 临界区对象 第三部分 线程同步方法 事件对象 第四部分 线程同步方法 互斥对象 第五部分 线程同步方法四 信号量Semaphore 网络编程 – 第五讲 第一部分 线程同步概述:必要性、示例和实现方法 1.1 必要性 同步就是协同步调,即按预定的先后次序运行。多线程编程过程中,一些敏 感数据不允许被多个线程同时访问,此时就必须同步访问技术,保证数据在任何 时刻最多只有一个线程访问。否则程序将失去封闭性和可再现性,程序运行的结 果可能不是我们所需要的。 回忆上节课所讲的多线程阻塞模式编程的Server端,我们利用pParam所表 示的内存空间向线程函数传递参数(pParam),显然这个内存空间是被多个线程 所共享的,有可能出现多个线程同时访问该参数空间而导致程序运行秩序的混 乱。(课堂上的程序演示中因为线程数量不多的原因,程序并未出现混乱。) 此外,还有另一个更为直观的例子:如果我们希望在程序中添加一个变量 counter来记录Server端的活动线程数量,则该变量必将被所有线程不定时地 读取并改写。 只有保证线程对这些临界资源的互斥访问,才能得到健壮的、正确的程序, 这就需要线程同步机制。 1.2 线程同步示例 见附录A 1.3 线程同步方法和比较 线程的同步可分用户模式和内核对象两大类: 用户模式的线程同步方法主要有原子访问和临界区等方法。其特点是同步速 度特别快,适合于对线程运行速度有严格要求的场合。 内核对象的线程同步则主要由事件、等待定时器、信号量等内核对象构成。 网络编程 – 第五讲 由于这种同步机制使用了内核对象,使用时必须将线程从用户模式切换到内核模 式,而这种转换一般要耗费近千个CPU 周期,因此同步速度较慢,但在适用性 上却要远优于用户模式的线程同步方式。 本课主要介绍如下几种线程同步方法: (1) 临界区对象 (2) 事件对象 (3) 互斥对象 (4) 信号量Semaphore 网络编程 – 第五讲 第二部分 线程同步方法 临界区对象 2.1 临界资源及访问方式 临界资源是一次仅允许一个线程使用的共享资源。每个线程中访问临界资源 的代码区域称为临界区(Critical Section)。每次只准许一个线程进入临界区,进入 后不允许其他线程进入。 如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试 图访问此临界区的线程将阻塞,一直持续到进入临界区的线程离开。临界区被释 放后,其他线程可以继续抢占,并以此达到共享资源的目的。 2.2 线程同步方法 2.2.1WINAPI 函数方法 CRITICAL_SECTION 是在windows.h 中定义的用来表征临界区的一个结构 体,利用该结构体定义临界区对象之后,可调用WINAPI 函数实现对临界资源的 互斥访问。步骤如下: (1) 定义临界区对象 (2) 初始化临界区对象 (3) 进入临界区 (4) 离开临界区 (5) 删除临界区。 2.2.2 MFC 临界区类CCriticalSection 使用步骤如下: (1) 定义临界区对象 (2) 进入临界区 (3) 离开临界区 网络编程 – 第五讲 2.3 四个WINAPI 函数 2.3.1 InitializeCriticalSection() void InitializeCriticalSection (LPCRITICAL_SECTION lpCriticalSection); 说明:初始化临界区对象,定义临界区对象后必须初始化后才能使用。 若有:CRITICAL_SECTION section;
文档评论(0)