本发明专利技术涉及一种通过读写锁实现线程间的同步方法方法,其步骤包括:1)初始化读写锁,将读临界区和写临界区初始化为可进入状态,写通知事件初始化为被触发状态;2)当多个读线程和/或写线程并发访问共享资源,根据临界区保护所述共享资源内关键代码,设置读写锁;3)返回读写锁信息完成读写锁设置,实现资源共享。本发明专利技术提出了以临界区和事件组合实现读写锁的方法,具有简单易用、轻量快速的特点,同时本方法采用临界区作为主要互斥工具,避免了使用内核态对象时的用户状态频繁切换的开销,写线程不会无限等待,只需要等待到申请写锁时的读线程都完成操作,而不会被后面申请读锁的线程抢占共享资源,大大提高了读写锁的性能。
【技术实现步骤摘要】
本专利技术涉及读写锁实现方法,尤其涉及基于读写锁的线程间的同步方法,可以应用于各种软件系统研发的软件开发
,属于信息
技术介绍
在信息
中,软件开发涉及很多的技术,包括内存数据组织管理、消息通信、索引技术、同步互斥技术等,本专利技术关注于软件开发中线程间的同步技术,在一些特定的软件系统研发过程中涉及到线程间的同步技术,而且对同步操作具有较高的实时性和高效性的要求,比如说实时数据库管理系统、关系数据库管理系统、中间件等。现有的并发同步互斥对象(可详见微软官方关于互斥对象的说明材料http://msdn. microsoft. com/en-us/1ibrary/windows/desktop/ms684266%28v=vs. 85%29. as px)主要有互斥量(Mutex)、信号量(Semaphore)、事件(Event)、临界区(Critical Section)(可详见微软官方关于临界区对象的说明材料http://msdn. microsoft. com/en-us/library/windows/desktop/ms682530%28v=vs. 85%29. as px)等,可根据对象所属层次分为内核态对象和用户态对象,也可根据用途分为进程间同步技术和线程间同步技术。临界区是保证在某一时刻只有一个线程能访问数据的简便办法,是用户态对象;互斥量跟临界区相似,只有拥有互斥对象的线程才具有访问资源的权限,但是比临界区复杂,属于内核态对象,可以在不同应用进程之间实现对资源的安全共享。信号量用来控制对一个具有有限数量用户资源进行并发访问,包含一个使用计数、最大资源数、当前资源计数,最大资源数表示信号量可以控制的最大资源数量,当前资源数表示信号当前可用的资源数量;事件用来通知线程有某些事件已发生,从而唤醒该线程执行后继任务。互斥量、信号量、事件都是内核态的互斥或同步技术,因此也可用作进程和线程间同步。临界区只能用作线程间同步,但由于是用户态技术,没有从内核态到用户态的环境切换开销,因此其性能优于互斥量。软件系统中大量的并发请求可以分为只读请求和读写请求,前者可以对共享资源同时操作,后者必须排它性的占有共享资源,不允许他人访问。这种情况下直接使用互斥量、信号量、事件等都是不合适的,一方面有较大的内核态与用户态的切换开销,另一方面没有区分并发读写请求的特点,导致可以并发执行的只读请求变成串行执行,大大降低了系统效率。因此,需要针对大量并发读写请求,精心设计一种线程间同步机制,实现最大化的并发执行,从而提高软件系统的整体性能。
技术实现思路
本专利技术针对实时数据库管理系统、关系数据库管理系统、中间件的线程间同步的实时性需求和性能要求,设计并提出了一种实时快速的多线程访问共享资源的同步方法。本专利技术要解决的技术问题在研发软件系统过程中通常会遇到多线程并发访问共享资源的问题,如果并发度比较低,用简单的互斥量(Mutex)就可以实现。但是,在并发度较高时,一些高性能软件系统也要求多线程间的同步操作具有较高的性能。并发的多线程按照是否修改共享资源可以分为两类只读线程和修改线程,一个好的多线程同步技术应该允许多个只读线程可以同时访问共享资源,其次更新线程应该在等待当前只读线程完成操作后即可马上获取共享资源,不会出现后继的只读线程从修改线程抢占共享资源的情况。由于主流操作系统如Windows 2000、Windows XP以及Windows 2003 Server没有内置读写锁,因此通常需要开发人员耗费较长的时间来设计和实现线程间的读写锁,而且最终实现的效果并不一定能够满足软件系统对线程间同步的高性能要求。本专利技术针对这类技术问题,提出了一种通用的、实时快速的线程间的读写锁解决方案如下,给出了读写锁的具体实现细节。一方面,可以大大减少开发人员的时间,另一方面,可以满足软件系统对多个读写线程之间进行同步的性能要求。,其步骤包括I)初始化读写锁,根据读写锁组件创建读临界区、写临界区和写通知事件三个对象,所述读临界区和所述写临界区初始化为可进入状态,所述写通知事件初始化为被触发状态;2)当多个读线程和/或写线程并发访问共享资源,根据所述临界区保护所述共享资源内关键代码,设置读写锁;2-1)申请读锁接口时,先进入写临界区再进入读临界区,根据读锁个数阻止写或读线程的操作,同时所述写通知事件设为非触发状态;释放读锁接口时,进入读临界区,若此时读锁个数为O则同时将所述写通知事件设为触发状态;2-2)申请写锁接口时,先进入写临界区再进入读临界区,根据写锁个数阻止写或读线程的操作,同时所述写通知事件设为非触发状态;释放写锁接口时;进入读临界区,同时所述写通知事件设为触发状态;3)遍历所述2-1)至2-2)返回读写锁信息完成读写锁设置,实现资源共享。所述读写锁组件中定义公开成员构造函数CReadWriteLock和析构函数 CReadWriteLock ;申请读锁接口函数ReadLock和释放读锁接口函数ReadUnlock ;申请写锁WriteLock接口函数和释放写锁接口函数WriteUnlock。所述读写锁组件中还定义了四个私有成员最大读锁个数m_ulMaxReadCount ;读临界区 m_hReadCriticalSection ;写临界区 m_hWriteCriticalSection ;写通知事件 m_hWriteNotifyEvent。所述最大读锁个数m_ulMaxReadCount默认为5。所述步骤2-2)中申请写锁时,设置一单位为毫秒级的超时等待时间,在超过所述等待时间后仍未获得写锁即返回失败。更进一步,所述步骤2-1)中,根据读锁个数阻止写或读线程的操作方法如下2-1-1)进入所述两个临界区后,若发现当前读锁个数已经达到最大数目,则返回失败,否则说明当前线程可继续进行读锁操作;2-1-2)当所述步骤2-1-1)中当前读锁数目未达到最大数目,可增加当前读锁个数,如果增加后读锁个数为1,则不能允许写线程进行操作。更进一步,所述步骤2-2)中,根据写锁个数阻止写或读线程的操作的方法如下2-2-1)先进入写临界区阻止其它线程申请读锁或写锁,然后在设定的等待时间内等待写通知事件以确保没有其它线程对共享资源进行读写操作;2-2-2)若在所述设定的等待时间内写通知事件没有被触发,则等待超时,返回失败;若在指定时间内写通知事件被触发,则说明此时已没有读线程,获得独占的写锁,然后将写通知事件设置为非触发状态,只要有读锁或写锁存在,就不允许新的写锁申请,返回成功;2-2-3)所述步骤2-2-2)如果返回成功,申请写锁线程不会离开写临界区,当返回失败,申请写锁的线程就要马上离开写临界区。更进一步,所述释放读锁过程中,只进入读临界区,不进入写临界区,然后将读锁个数减1,当减到O时,将通知事件设为触发状态,退出读临界区;更进一步,所述释放写锁过程中,先将写通知事件设为触发状态,再退出写临界区。更进一步,所述读写锁在Windows2000、WindowsXP 以及 Windows2003Server 中没有内置读写锁的操作系统中进行操作。读写锁解决方案主要涉及三个部分,读写锁进行并行申请、并行处理1)读写锁初始化过程;2)申请与释本文档来自技高网...
【技术保护点】
一种读写锁实现方法,其步骤包括:1)初始化读写锁,根据读写锁组件创建读临界区、写临界区和写通知事件三个对象,所述读临界区和所述写临界区初始化为可进入状态,所述写通知事件初始化为被触发状态;2)当多个读线程和/或写线程并发访问共享资源,根据所述临界区保护所述共享资源内关键代码,设置读写锁;2?1)申请读锁接口时,先进入写临界区再进入读临界区,根据读锁个数阻止写或读线程的操作,同时所述写通知事件设为非触发状态;释放读锁接口时,进入读临界区,若读锁个数为0则同时将所述写通知事件设为触发状态;2?2)申请写锁接口时,先进入写临界区再进入读临界区,根据写锁个数阻止写或读线程的操作,同时所述写通知事件设为非触发状态;释放写锁接口时,进入读临界区,同时所述写通知事件设为触发状态;3)遍历所述2?1)至2?2)返回读写锁信息完成读写锁设置,实现资源共享。
【技术特征摘要】
【专利技术属性】
技术研发人员:李坤,王永炎,郭超,王宏安,
申请(专利权)人:中国科学院软件研究所,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。