Win32多线程同步技术浅析.doc_第1页
Win32多线程同步技术浅析.doc_第2页
Win32多线程同步技术浅析.doc_第3页
Win32多线程同步技术浅析.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

win32 多线程同步技术浅析章 秦(中国电子科技集团公司 第三十九研究所, 陕西 西安 710065)摘要: 简要介绍了在 win32 环境下多线程访问共享资源时的同步机制 ,讨论了主 要 的 4 种 同 步 对象 ( 临 界 区、 互 斥元、事件、信号量),并描述了它们的优缺点,给出了使用 win32 api 函数操控这 4 种对象实现多线程同步的方法。关键词: 多线程; 同步; 临界区; 互斥元; 事件; 信号量文章编号:16746236(2011)21-0056-03中图分类号: tp311.1文献标识码: aanalysis of synchronization mechanisms for multithread in win32 systemzhang qin(the 39th institute,electronic science&technology group corporation of china,xian 710065, china)abstract: this paper briefly introduces the synchronization mechanisms of multithread in win32 environment, discusses thefour principal synchronization objects (critical section、mutex、event and semaphore),and describes their advantages and disadvantages.finally gives the method of muitlthread synchronization based on win32 api for each object.key words: multithread; synchronization; critical section; mutex; event; semaphore众所 周 知 , 计算 机 由 硬件 和 软 件两 部 分 组成 , 操 作 系 统是配置在计算机硬件上的第一层软件, 其他所有的软件,都 依赖于操作系统的支持。 常用的 windows 操作系统,是典型 的多进程、多线程的多任务操作系统。 线程的使用,改善了资 源利用率、提高了系统吞吐量、减小了系统开销,但由于线程 运行的异 步性 , 也 给 操作 系 统 带来 了 一 些问 题 , 尤 其是 在 它 们争用共享资源的时候。 因此,必须采取有效措施,保证线程 协同工作,避免访问异常和冲突。图 1 win32 内核线程示意图fig.1 schematic diagram of win32 kernel thread运行。 从并发性角度来看,引入线程后,不仅进程之间可以并 发执行,而且在一个进程中的多个线程之间,亦可并发执行 , 从而能更有效的使用系统资源、提高系统吞吐量。 从系统开 销来看,由于线程的创建、切换、终止只涉及了少量的寄存器 操作,而不涉及到资源的分配、回收以及 cpu 环境的操作,因 而操作系统的开销显著降低。虽然线程的引入使操作系统性能得到了质的飞跃,但也 给多个线程协同的访问共享资源带来了一些问题。 在多线程 工作过程中,当其中一个线程被调度执行并需要访问共享资 源的时候,它并不能确定将要访问的系统资源是不是处在就 绪的状态。 例如,需要访问的数据、设备是否是完备、有效等。 如果访 问 到非 就 绪 状态 的 资 源 , 要 么 会 引入 失 效 数据 , 要 么 会引起硬件冲突,这将给程序执行带来重大错误或异常 。 因 此,多线程访问共享资源必须要采用同步技术加以协调。1win32 线程程序 是 一组 指 令 的有 序 集 合 ,本 身 没 有 任 何 运 行 的 含义,只是一个静态实体。 进程是资源分配和独立运行的基本单位, 是可并发执行的程序在一个数据集合上的运行过程 , 是一个动态实体。 线程是进程中的一个实体,是被操作系统 独立调度和分派的基本单位。 通常情况下,线程除了拥有自 身运行所 必 不可 少 的 计数 器 、 寄 存器 等 资 源外 , 本 身 不拥 有 系统资源,所以必须依存在进程中,而不能独立执行。 同属一 个进程的所有线程可共享该进程拥有的全部资源,即进程的 代码段、 数据段以及系统资源, 如打开的文件、i/o 设备等。 win32 操作系统中进程、线程关系如图 1 所示。操作系统中引入进程, 是为了支持多个程序并发执行 ,以改善资 源 利用 率 及 提高 系 统 的吞 吐 量 ; 引入 线 程 , 则是 为 减少程序并发执行时所付出的时空开销,使操作系统具有更 好的并发性。 从调度处理来看,线程是调度和分派的基本单 位,进程 只 作为 资 源 拥有 的 基 本单 位 , 这 样线 程 便 能够 轻 装线程同步技术多线 程 之间 的 关 系, 一 般 而 言可 分 为 两种 , 一 种 是 资 源2收稿日期:2011-09-26稿件编号:201109155作者简介:章 秦(1978 ),女,陕西西安人,硕士,工程师。 研究方向:计算机控制与应用。共享关系,另一种是相互合作关系。 资源共享关系的多个线程,其线程同步的主要目的是保证各线程能互斥的访问共享 资源。 相互合作关系的多个线程,其同步的主要目的是保证 相互合作的各个线程在执行次序上的协调,不出现与时间有 关的差错。win32 操作系统中主要利 用临 界 区 (critical section)、 互 斥 元 (mutex)、 信 号 量 (semaphore)、 事 件 (event) 等 4 种 对 象 来实现线程的同步。 其中临界区、互斥元、事件提供的是一种 互斥 的 访 问控 制 机 制 , 即 对 那 些互 斥 性 访问 资 源 进行 “ 我 访 问,你等待;我用完,你再用”的同步控制机制。 信号量则提供 限制性访问控制机制,即对那些限制线程访问数量的资源进 行“我们访问,你等待;我们走一个,你再来”的控制机制。 在 这 些同 步 对 象中 , 只 有 临界 区 不 是内 核 对 象 , 它 不 由 操 作 系 统的低级部件管理,不能使用句柄来操纵。2.1 临界区还没有离开,其它所有试图进入此临界区的线程都会被挂起而 进 入 到等 待 状 态, 并 会 在 一定 程 度 上影 响 程 序 的 运 行 性 能。 尤其是不要将等待用户输入或是其它一些外界干预的操 作包含到临界区内。2)“进入区”和“退出区”如同一对括号包括着 “临界区”, 它们必须成对出现。 如果线程离开临界区时不做 “退出”操 作 , 则 其 他 线 程 将 无 限 期 等 待 。 换 句 话 说 , 在 执 行 了 entercriticalsection ()语句进入临界区后 ,必 须确 保 有 与之 匹 配的 leavecriticalsection()能执行。3)虽然临界区同步速度很快,但由于临界区不是系统内核 对 象, 所 以 只 能用 来 同 步本 进 程 内的 线 程 , 而不 能 跨 进 程 使用。互斥元互斥元的功能和临界区很相似,但也有一些区别 。 互斥 元是内核对象,可以被命名,可以拥有句柄。 所以互斥元可以 跨进程使用。 而且等候互斥元信号时还可以设定失效时间 , 避免等待时间太长。 但互斥元作为内核对象的这些优点是有 代价 的 , 互 斥元 所 花 费的 系 统 时间 和 消 耗的 系 统 资源 , 要 比 临界区多很多。win32 系 统 中 , 在 使 用 互 斥 元 同 步 机 制 时 , 首 先 使 用createmutex()函数创建一个互斥元,使用 waitforsingleobject() 函 数 ( 需 要 监 测 多 个 信 号 时 可 使 用 waitformultipleobjects()函数)等待互斥元信号。 当某一线程成功获得互斥元信号 后,该线程就可以对互斥资源进行访问。 资源访问结束后,可 使用 releasemutex()函数来释放该线程对互斥元的占用。 最 后,当不再使用该互 斥 元 时 , 使 用 closehandle () 函 数来 注 销 互斥元。waitforsingleobject () 函 数 是 使 用 互 斥 元 及 下 文 中 的 事 件 、 信 号 量 等 内 核 对 象 实 现 线 程 访 问 同 步 的 关 键 函 数 。 waitforsingleobject()函数是内核对象信号等待函数,一旦被 监测 的 互 斥元 、 事 件 、 信号 量 对 象为 有 信 号状 态 时 即 可 成 功 返回 , 并 且 除了 手 动 重置 的 事 件以 外 , 对 象将 自 动 变 成 无 信 号状态。 而且监测对象信号时,可设定超时时间,以免出现线 程死锁。 waitformultipleobjects()函数和 waitforsingleobject() 函 数 类 似 , 也 是 内 核 对 象 信 号 监 测 函 数 , 区 别 仅 是waitformultipleobjects () 可 以 同 时 监 测 多 个 信 号 , 并 可 按 照 设定在所有信号有效或任一信号有效时返回。使用互斥元访问共享资源的流程如图 3 所示。2.2对于 那 些 需要 互 斥 访问 的 共 享 资 源 ,可 称 之 为 临 界 资源。 不论是硬件临界资源,还是软件临界资源,多个线程必须互斥的进行访问。 线程中访问临界资源的那段代码,称之为 临界区。 也就是说,临界区是一段独占访问共享资源的代码。 在多个线程试图同时访问临界区时,当其中一个线程进入该 临界区后,其他所有试图访问此临界区的线程将被阻塞 。 在 占用临界区的线程离开后,才允许其他线程进入。win32 系 统 中 , 在 使 用 临 界 区 同 步 机 制 时 , 首 先 需 要 定 义一个临界区对象,然后使用 initialcriticalsection()函数初始 化该对象。 之后,各相关线程就可以使用临界区进行同步协 调工作了。 使用临界区对象访问临界资源的循环流程如图 2 所示。图 2 临界区循环流程图fig.2 flow chart of critical section当一个线程欲访问临界资源需要进入临界区时 ,将对该 临界资源进行检查,看它是否正被访问。 这部分是“进入区”, 可调用 entercriticalsection()函数来实现。 如果此刻该临界资 源正在被访问,那么这个线程将被阻塞挂起而不许进入临界 区。 一直等到可以访问时,才让其进入临界区内访问临界资 源。 线程在临界区内完成临界代码段的执行后 ,需告知操作 系统本次临界资源访问结束的信息。 这部分是“退出区”,可 调用 leavecriticalsection()函数来实现。 其他有访问需求的线 程就 可 以 进入 临 界 区继 续 执 行该 代 码 段 。 退 出 临 界 区 的 线 程,可接着执行非临界的代码,把这些代码区称为 “剩余区”。 最 后, 当 所 有 线程 不 再 使用 该 临 界区 对 象 的时 候 , 还 需 要 将 其销毁,可调用 deletecriticalsection()函数来实现。临界区是将特殊的代码执行做串行化处理来避免冲突 ,是一种简单有效的线程同步技术。 在使用临界区时 ,需要注 意几点:图 3 win32 互斥元使用示意图fig.3 schematic diagram of win32 mutex建互斥元之前 ,可使用 openmutex() 函 数 检 查相 同 名 称的 互斥元是否存在。互斥元能超越进程进行资源访问的同步控制 ,是一种简 单而又强大的线程同步对象。 但是,和临界区相比,互斥元所 花费的系统资源比临界区多的多,在那些能够使用临界区的 地方,建议尽量使用临界区。2.3 事件个线程访问, 而第 n+1 以后的线程只能挂起处于等待状态,当 n 个线程的某一个线程访问结束后,第 n+1 个线程才能投 入运行。 信号量也是内核对象,可以被命名,可以拥有句柄, 所以信号量可以跨进程使用。win32 系 统 中 , 在 使 用 信 号 量 做 线 程 同 步 机 制 时 , 首 先 必须使用 createsemaphore()函数创建一个信号量。 创建时要 指定 允 许 的最 大 线 程数 量 ( 最 大值 ) 和 当 前可 允 许 的 线 程 数 量(现值),以及信号量的名称。 一般在创建时将信号量的现 值设置为最大值。当 线 程 需 要 访 问 信 号 量 同 步 的 资 源 时 , 可 使 用 waitforsingleobject()函数等待信号。 当每增加一个线程对共 享资源的访问时,信号量的现值就会减 1,只要当前的现值大 于 0,就还可以允许其他等待的线程获得信号。 现值减小到 0 时, 说 明 当 前占 用 资 源的 线 程 数已 经 达 到了 所 允 许 的 最 大 数,其他等待的线程将被挂起。 线程在处理完共享资源后,通 过 releasesemaphore () 函 数 做 信 号 量 占 用 释 放 , 这 时 信 号 量事件对象和互斥元一样,都属于内核对象。事件中包括了 3 个 主要 的 数 据: 资 源 使 用计 数 、 重 置模 式 ( 自 动重 置 、 手动重置)、信号状态(有、无信号)。 按事件的重置模式划分,事 件对象可分为手动重置事件的和自动重置事件。 手动重置事 件被 置 为 有信 号 状 态后 , 会 唤 醒所 有 等 待的 线 程 , 并且 会 一 直保 持 为 有信 号 状 态 , 直 到 程 序重 新 将 其设 置 为 无 信 号 状 态。 自动重置事件被设置为有信号状态后,会唤醒“一个”等 待中的线程,然后自动恢复为无信号状态。 自动重置事件简 单易用,如果要同步两个线程,用自动重置的事件比较理想。 win32 系 统 中 , 在 使 用 事 件 做 线 程 同 步 机 制 时 , 首 先 必须使用 createevent()函数创建一个事件对象。 创建事件对象时同 时 要 指定 该 事 件对 象 的 重置 方 式 、 初始 信 号 状态 , 以 及 事件变量的名称。 对于自动重置事件,一旦相关线程通过使 用 waitforsingleobject () 函 数 获 得 信 号 后 , 该 事 件 将 自 动 重 置 为无 信 号 状态 , 等 到 该线 程 访 问资 源 完 毕返 回 后 , 该 事 件 又 将自 动 重 置为 有 信 号状 态 。 对 于手 动 重 置 事 件 , 可 使 用 setevent()函数使事件为有信号状态,这时,所有等待该事件 信号的线程会被全部唤起,而且事件将一直保持为有信号状 态,直到 程 序 主动 执 行 resetevent () 函数 将 事 件重 置 为 无信 号状态。 最后,当不再使用该事件对象时,使用 closehandle() 函数来注销事件。使用手动重置事件对象访问资源协同工作的流程如图 4所示。的 现 值 将 加 1。最 后 , 当 不 再 使 用 信 号 量 对 象 时 , 使 用closehandle()函数来注销信号量。使用信号量访问资源的流程如图 5 所示。图 5 win32 信号量使用示意图fig.5 schematic diagram of win32 semaphore另外,作为内核对象,信号量和互斥元、事件一样不能重复创建。 在创建信号量之前,可使用 opensemaphore()函数检 查信号量对象是否存在。信号量最大的优点就是计数功能,也就是能对访问资源 的线程数做上限控制,这一特点使得信号量在一些用户限制 类软件中非常有用。结束语临界区、互斥元、信号量、事件是 win32 平台上常用的 4 种线程同步对象,它们是针对不同的同步要求而设计的 。 临 界区通过将特殊访问串行化来实现临界资源的访问同步 ,它 虽然 无 法 跨进 程 使 用 , 但 临 界 区速 度 快 , 因而 很 适 合 用 在 全 局数据的访问控制应用中。 互斥元如同一个资源保护锁 ,常 用来协调线程独占的访问一个共享的资源。 信号量具有资源 访问计数的功能,因此一般多用在控制访问资源的用户数方 面。 事件像一个全局开关,常用来标示一些动作已发生或一 些任务已完成,一般用来协调软件的各线程按某一时序正常 运行。临界区、互斥元、信号量、事件 4 个同步对象在多线程软 件中广泛使用。 在实际的软件设计和编程过程中 ,除了可直(下转第 61 页)3图 4 win32 事件(手动重置)使用示意图fig.4 schematic diagram of win32 event (manual reset)另外,既然是内核对象,事件对象同样不能重复创建。 在 创建 事 件 对象 前 , 可 使用 openevent() 函 数 检 查 一 个 事 件 对 象是否存在。 如果成功返回,则说明该名称的事件对象是存 在的,不能再次创建。信号量信号 量 和 互斥 元 很 类似 , 但 信 号量 可 以 计 数 , 即 信 号 量 可以允许多个线程同时访问同一个共享资源。 可见,互斥元 是一种仅允许线程数为一的信号量。信号量允许多个线程在同一时刻访问同一资源 ,但对访 问线程的最大数量有所限制。 当某一资源可以允许同时有 n2.4通过表中数据可以看出:文中提出的新特征参数由于比mfcc 参数增加了短时能量和短时过零率的信息, 也就是增 加了每帧语音信号的时域和频域信息,能够更准确地捕捉每 帧 信号 的 具 体特 征 , 以 及每 个 时 刻的 变 化 情况 , 能 更 好 地 把 相近的语音信号区分开,因而一定程度上提高了语音信号的 识别率。2 陈勇,屈志毅,刘莹,等.语音特征参数mfcc的提取及其应用j. 湖 南 农 业 大 学 学 报 : 自 然 科 学 版 ,2009,35 (1):106-107.chen yong,qu zhi-yi,liu ying, et al. the extraction and application of phonetic characteristic parameter mfcc j. journal of hunan agricultural university:natural sciences,2009,35(1):106-107.3 韩纪庆,张磊,郑铁然.语音信号处理m.北京:清华大学出 版社,2004.4 张君昌,李艳艳.基 于小 波 变 换的 鲁 棒 性语 音 特 征提 取 新 方法j.计算机仿真,2010,27(8):355-358.zhang jun-chang,li yan-yan. a new robust speech feature extraction method based on wavelet transform j. computer simulation, 2010,27(8):355-358.5 何强,何英.matlab扩展编程m.北京:清华大学出版社 ,2002.6 袁正午,肖旺辉.改进的混合mfcc语音识别算法研究j.计 算机工程与应用,2009,45(33):108-110.yuan zheng-wu, xiao wang-hui.improved speech recognition algorithm based on mfcc featurej. computer engineeringand applications,2009,45(33):108-110.结束语首先,文中介绍了语音信号的短时能量、短时过零率,以 及 mfcc 参数6的相关知识;其次,提出了新的语音信号的特 征参数,分别阐述了其计算流程和理论依据;最后,以 4 个语 音信号为例,通过语音识别系统比较了 mfcc 参数和新特征 参数的优劣。 仿真实验表明了新参数取得了较高的识别率, 但也有一定的不足,如:能否使新参数更加简化,能否进一步 提高其识别率。 这是今后研究工作的重点。参考文献:1 王伟 , 邓 辉文.基 于mfcc 参数 和vq 的 说话 人 识 别系 统j.仪器仪表学报,2006,27(6):2253-2255.wang wei,deng hui-wen. speaker recognitio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论