标题 | 几种典型同步模型的探讨 |
范文 | 鲁向前+谢垂益 摘要:从同步线程数量和同步方向角度把同步模型分为六种类型,即单线程-单线程单向同步、单线程-单线程循环双向同步、单线程-多线程单向全部同步、单线程-多线程单向部份同步、多线程-单线程单向全部同步和多线程-单线程单向部份同步。在Windows7+VS2012平臺下,使用每线程一窗口的独立窗口过程函数独立处理窗口消息,实现同步线程之间输出无耦合,力求使同步验证简单直观。实践证明,模型分类简单,验证过程有效。 关键词:线程;进程;同步;并发;并行 中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)27-0266-03 Abstract: Divide the synchronization(hereinafter referred to as SYN) model into six types from the perspective of synchronous threads number and the SYN direction,including Single-Single Threads(SST) one-way SYN,SST two-way loop SYN,Single-Multiple Threads(SMT) one-way all SYN,SMT one-way partial SYN,MST one-way all SYN and MST one-way partial SYN.In the Windows7+VS2012 platform, with the method of one window per thread and its independent window process function to handle the window message,to achieve non-coupled output between the SYN threads, and strive to make SYN verification simple and intuitive.Practice prove that the model classification is simple and the verification process is effective. Key words: thread; process; synchronization; concurrency; parallel 1 背景 互斥同步技术是实现操作系统内核功能如进程控制、进程通信等的基本保障技术[1],同时,许多应用软件在解决并发并行任务时也广泛使用操作系统中原本为内核需求提供的同步互斥技术[2-3]。因此对该技术进行归纳和建立一些标准的应用模板,对我们在解决应用中的并发并行问题具有启发意义。 不同的操作系统以及不同语言集成开发类库或第三方提供的开发软件包提供的同步互斥内核技术和开发接口并不相同,但从应用端来说,可以使用相似的同步互斥框架来实现,一般都是使用P/V原语的方法来描述同步互斥的解决方案。 操作系统中同步互斥综合实例有哲学家进餐问题、读者-写者问题、生产者-消费者问题等,许多学者对这些算法进行了研究和实现[4-7]。本文从线程数量和同步方向角度总结出几种典型的同步模型,并在Windows7+VS2012平台上实现和验证,以帮助开发者厘清思路,快速选择同步应用方案。 2 Windows提供的同步对象及接口介绍 Windows提供的同步对象有事件对象、信号量对象等[8],每种同步对象提供了相应的创建对象的内核函数以及相关的其他对象操作函数。 1) 事件对象:Windows提供的创建事件对象函数是CreateEvent。该函数返回事件对象句柄。函数的第二个参数用于指定创建的事件对象是否是人工重置的事件对象,如果为false,表示非人工重置(即自动重置)事件对象,如果为true,表示人工重置事件对象。函数的第三个参数表示事件对象的初始状态,如果为true,表示事件对象创建成功后的初值为有信号状态,否则为非信号状态。 事件对象的相关函数主要有:SetEvent和ResetEvent。自动重置事件对象在任意一个等待该事件对象的线程被释放时,都会自动的将该事件对象置为非信号状态。ResetEvent函数主要用于人工重置事件对象。人工重置对象不能自动被置为非信号状态,必须调用ResetEvent函数才能置为非信号状态。人工重置事件对象为有信号状态时,对使用该指定事件对象作为参数调用Wait**函数的任何数量的等待线程或后续线程,都能够获得同步信号。 2) 信号量对象:Windows提供的创建信号量对象函数是CreateSemaphore。函数的第三个参数用于指定信号量对象的最大值,第二个参数用于指定信号量对象内部计数变量的初始值。操作系统内核对信号量对象内部计数变量值进行管理,当一个线程调用ReleaseSemaphore函数时,该值会加上指定值,当释放待该信号量对象的线程时,该值会减1。 3) 同步对象的相关函数:Windows提供一组可以使线程阻塞自身执行的等待函数,如WaitForSingleObject与WaitForMultipleObjects,分别用于等待单一同步信号和等待多个同步信号。一个线程在调用这类函数后,如果等待的同步对象处于非信号状态,将会被置于阻塞状态。当同步对象处于有信号状态时,操作系统会发送同步信号给该线程。 3 几种典型的同步模型 下文同步模型图形中的符号约定:实线箭头代表线程的执行流程,虚线箭头代表同步信号的发生过程(但要注意,同步信号并非由一个线程直接发送到另一个线程,而是由操作系统完成同步信号的通信过程),矩形框代表线程处于阻塞状态。 在实现中每个线程创建各自独立的窗口,各个窗口使用各自独立的窗口过程函数进行消息处理。 创建同步对象的代码写在程序主函数内,其他代码写在各自线程窗口过程函数内的鼠标右击事件中。实现代码中的WaitFor**函数相当于P原语,SetEvent函数和ReleaseSemaphore函数相当于V原语。 验证时应先在B系列线程的窗口中右击鼠标,以使B系列线程先执行P原语,线程阻塞(即等待同步信号),然后再在A系列线程的窗口中右击,使A系列线程执行V原语,让线程发出同步信号,以便观察所有线程的同步执行结果。 1) 单线程-单线程单向同步 2) 单线程-单线程循环双向同步 同步模型如图2所示。模型中使用两个自动重置事件对象。初始时使一个处于有信号状态,另一个处于无信号状态。 3) 单线程-多线程单向全部同步 6) 多线程-单线程单向部份同步 同步模型如图6所示。实现时与(5)相似,只需把线程B代码中的4改为3即可。验证时只需A系列线程中的任意3个线程发出同步信号即可激活B线程。 4 结束语 本文使用Windows平台提供的同步对象实现了多种同步模板,但各种同步模型的实现方法并不唯一,读者也可以使用其他同步对象或同步通信函数来实现。读者也可以使用其他平台如Linux+Java平台提供的类似的同步技术来完成,也可以在Windows平台下使用VS的封装接口进行实现。 参考文献: [1] 汤小丹, 梁红兵, 哲凤屏, 等. 计算机操作系统[M]. 西安: 西安电子科技大学出版社, 2014. [2] 牛欣源. 进程同步的资源管理模型构建与应用[J]. 计算机技术与发展, 2010, 20(06):9-12,17. [3] 王晓瑞. 基于SOA的分布式异构数据库数据信息同步系统的研究与应用[D].开封: 河南大学, 2016. [4] 張步忠. Java语言中的线程同步互斥研究[J]. 安庆师范学院学报:自然科学版, 2011, 17(4):106-110. [5] 鲁力, 韩洁, 徐琴. PV操作解决进程同步问题的难点研究与实现[J]. 电脑知识与技术, 2017, 13(13):38-39. [6] 常静. 操作系统中PV操作实现进程的同步与互斥[J]. 电脑知识与技术, 2012, 18(30):7144-7147,7153. [7] 高升, 陈月峰. 哲学家就餐问题的算法实现[J]. 计算机工程与科学, 2016, 38(2):269-276. [8] Windows帮助文档[EB/OL].https://msdn.microsoft.com/en-us/library/windows/desktop/ms686360(v=vs.85).aspx. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。