首页> 中国专利> 一种线程同步方法及线程同步系统

一种线程同步方法及线程同步系统

摘要

本申请公开了一种线程同步方法及线程同步系统,其中,所述线程同步方法通过所述析构函数来保证线程访问任一所述保护区域成功后将所述第一变量的状态更改为第一状态,以释放在所述线程访问过程中对于所述保护区域的锁定,从而实现及时释放所述保护区域的目的;并且在当正在访问所述保护区域的线程被杀掉时,也不会影响析构函数的正常运行,从而避免了由于正在访问所述保护区域的线程被杀掉而可能导致的死锁现象出现。并且所述线程同步方法实现了以一个变量的状态来控制所有所述保护区域是否可被访问的状态,从而实现所有所述保护区域的状态处于可控状态的目的。

著录项

  • 公开/公告号CN106980544A

    专利类型发明专利

  • 公开/公告日2017-07-25

    原文格式PDF

  • 申请/专利权人 北京奇艺世纪科技有限公司;

    申请/专利号CN201710208287.0

  • 发明设计人 陈阳春;王雁;

    申请日2017-03-31

  • 分类号G06F9/52(20060101);

  • 代理机构11227 北京集佳知识产权代理有限公司;

  • 代理人王宝筠

  • 地址 100080 北京市海淀区北一街2号爱奇艺创新大厦10、11层

  • 入库时间 2023-06-19 02:53:54

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-03-03

    授权

    授权

  • 2017-08-18

    实质审查的生效 IPC(主分类):G06F9/52 申请日:20170331

    实质审查的生效

  • 2017-07-25

    公开

    公开

说明书

技术领域

本申请涉及计算机应用技术领域,更具体地说,涉及一种线程同步方法及线程同步系统。

背景技术

多线程操作可以实现充分利用系统资源,缩短程序响应时间和改善用户体验的目的,因此广泛应用于各类计算机程序中。线程同步是多线程操作中不可或缺的步骤,合理有效的线程同步能够有效地保证数据的正确性和程序的正常运行。

由于在系统中存在一些敏感数据,这些敏感数据不允许被多个线程同时访问,此时就需要对多线程进行线程同步,以保证在同一时间只有一个线程访问包含敏感数据的保护区域,从而保证敏感数据的完整性。线程同步是指多线程之间的协同步调,即多线程之间按照预定的先后次序访问保护区域。现有技术中对多线程进行线程同步的方法主要包括“临界区法”“事件法”“互斥量法”和“信号量法”,但是在实际应用过程中,这些线程同步方法都可能会存在当访问保护区域的线程被杀掉,而导致的保护区域得不到释放或重置的情况出现,在这种情况下,其他线程无法访问保护区域,导致死锁。

发明内容

为解决上述技术问题,本发明提供了一种线程同步方法及线程同步系统,以实现避免由于当访问保护区域的线程被杀掉而可能出现的死锁现象。

为实现上述技术目的,本发明实施例提供了如下技术方案:

一种线程同步方法,包括:

定义全局变量,所述全局变量包括第一变量和第二变量,所述第一变量包括第一状态和第二状态,所述第二变量用于对所述第一变量进行加锁操作;

在每个保护区域中新建互斥锁类对象,类包括析构函数和指针成员变量,所述指针成员变量用于保存所述第一变量和第二变量;

将所述第一变量和第二变量均以指针参数形式传入所有所述互斥锁类对象的构造函数中,所述第一变量包括第一状态和第二状态,所述第一变量所处状态用于标识所述保护区域是否可被线程访问;

当所述线程请求访问任一所述保护区域时,根据所述第一变量所处状态判断所述保护区域是否可被访问,在所述保护区域可被访问时访问所述保护区域,并在访问成功后在所述析构函数中更改所述第一变量所处状态以使所述保护区域可被访问。

可选的,当所述第一变量处于第一状态时,所有所述保护区域处于可被线程访问状态,当所述第一变量处于第二状态时,所有所述保护区域处于不可被线程访问状态。

可选的,所述当所述线程请求访问任一所述保护区域时,根据所述第一变量所处状态判断所述保护区域是否可被访问,在所述保护区域可被访问时访问所述保护区域,并在访问成功后在所述析构函数中更改所述第一变量所处状态以使所述保护区域可被访问包括:

当所述线程请求访问任一所述保护区域时,获取所述第一变量所处状态,判断所述第一变量状态是否处于第一状态,如果是,则访问所述保护区域,并利用所述第二变量对所述第一变量进行加锁操作,并将所述第一变量的状态更改为第二状态,当该线程访问成功后在所述析构函数中将所述第一变量的状态更改为第一状态;如果否,则判断访问时间是否超时,若否,则在预设时间后返回获取所述第一变量所处状态的步骤。

可选的,所述获取所述第一变量所处状态包括:

利用查询函数获取所述第一变量所处状态。

一种线程同步系统,包括:

变量定义模块,用于定义全局变量,所述全局变量包括第一变量和第二变量,所述第一变量包括第一状态和第二状态,所述第二变量用于对所述第一变量进行加锁操作;

类定义模块,用于在每个保护区域中新建互斥锁类对象,类包括构造函数、析构函数和用于保存所述第一变量和第二变量的指针成员变量;

传入模块,用于将所述第一变量和第二变量均以指针参数形式传入所有所述互斥锁类对象的构造函数中,所述第一变量包括第一状态和第二状态,所述第一变量所处状态用于标识所述保护区域是否可被线程访问;

判断模块,用于当所述线程请求访问任一所述保护区域时,根据所述第一变量所处状态判断所述保护区域是否可被访问,在所述保护区域可被访问时访问所述保护区域,并在访问成功后在所述析构函数中更改所述第一变量所处状态以使所述保护区域可被访问。

可选的,当所述第一变量处于第一状态时,所有所述保护区域处于可被线程访问状态,当所述第一变量处于第二状态时,所有所述保护区域处于不可被线程访问状态。

可选的,所述第一变量为布尔型变量,所述第一状态为False,第二状态为True;

所述第二变量为线程锁变量。

可选的,所述判断模块具体用于,当所述线程请求访问任一所述保护区域时,获取所述第一变量所处状态,判断所述第一变量状态是否处于第一状态,如果是,则访问所述保护区域,并利用所述第二变量对所述第一变量进行加锁操作,并将所述第一变量的状态更改为第二状态,当该线程访问成功后在所述析构函数中将所述第一变量的状态更改为第一状态;如果否,则判断访问时间是否超时,若否,则在预设时间后返回获取所述第一变量所处状态的步骤。

可选的,所述判断模块获取所述第一变量所处状态具体用于,利用查询函数获取所述第一变量所处状态。

从上述技术方案可以看出,本发明实施例提供了一种线程同步方法及线程同步系统,其中,所述线程同步方法通过析构函数来保证线程访问任一保护区域成功后在析构函数中更改第一变量所处状态以使保护区域可被访问,以释放在线程访问过程中对于保护区域的锁定,从而实现及时释放所述保护区域的目的;并且在当正在访问所述保护区域的线程被杀掉时,也不会影响析构函数的正常运行,从而避免了由于正在访问所述保护区域的线程被杀掉而可能导致的死锁现象出现。

并且所述线程同步方法通过第一变量所处状态来反映保护区域的可访问状态,通过定义第二变量来对第一变量进行加锁以进行保护,并且第一变量和第二变量以指针参数的形式传入所有互斥锁类对象的构造函数中,实现以一个变量的状态来控制所有保护区域是否可被访问的状态,从而实现所有保护区域的状态处于可控状态的目的。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请的一个实施例提供的一种线程同步方法的流程示意图;

图2为本申请的另一个实施例提供的一种线程同步方法的流程示意图;

图3为本申请的又一个实施例提供的一种线程同步方法的流程示意图;

图4为本申请一个实施例提供的一种线程同步系统的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本申请实施例提供了一种线程同步方法,如图1所示,包括:

S101:定义全局变量,全局变量包括第一变量和第二变量,第一变量包括第一状态和第二状态,第二变量用于对第一变量进行加锁操作;

S102:在每个保护区域中新建互斥锁类对象,类包括析构函数和指针成员变量,指针成员变量用于保存第一变量和第二变量;

S103:将第一变量和第二变量均以指针参数形式传入所有互斥锁类对象的构造函数中,第一变量包括第一状态和第二状态,第一变量所处状态用于标识保护区域是否可被线程访问;

S104:当线程请求访问任一保护区域时,根据第一变量所处状态判断保护区域是否可被访问,在保护区域可被访问时访问保护区域,并在访问成功后在析构函数中更改第一变量所处状态以使保护区域可被访问;

需要说明的是,在现有技术中,当一个线程进入一个保护区域时,编译器或执行器自动生成一个临时变量用来加锁该保护区域,其他线程想要访问该保护区域就会被阻塞,直到之前访问该保护区域的线程访问完毕离开时通过临时变量解锁该保护区域,其他线程才可以访问该保护区域。

在本申请中,第一变量和第二变量以指针参数的形式传入所有互斥锁类对象的构造函数中后,每个互斥锁类对象的构造函数就会进行赋值操作,将第一变量和第二变量均赋值给互斥锁类对象中定义的第一变量指针成员变量和第二变量指针成员变量,完成所述指针成员变量保存所述第一变量和第二变量的操作。第一变量用于标识保护区域的访问状态,当某一线程想要访问任一保护区域时通过第一变量的所处状态来判断该保护区域是否可被访问,在访问过程中利用第二变量对第一变量进行加锁,该加锁操作与现有技术中临时变量对保护区域的加锁操作相同,本申请在此不做赘述。第二变量对第一变量进行加锁操作的目的是避免该线程访问过程中第一变量的状态发生改变,并在线程访问完成后更改第一变量的状态,相当于利用第二变量实现对保护区域的加锁和解锁操作,避免了在线程访问保护区域的过程中被杀掉而导致的死锁现象。

互斥锁类对象为线程同步方法在每个保护区域中的载体,以保证线程同步方法在每个保护区域中的执行;在本申请的其他实施例中,类还包括用于查询第一变量状态的查询函数。

在上述实施例的基础上,在本申请的一个具体实施例中,当第一变量处于第一状态时,所有保护区域处于可被线程访问状态,当第一变量处于第二状态时,所有保护区域处于不可被线程访问状态。

如图2所示,当线程请求访问任一保护区域时,根据第一变量所处状态判断保护区域是否可被访问,在保护区域可被访问时访问保护区域,并在访问成功后在析构函数中更改第一变量所处状态以使保护区域可被访问包括:

S1041:当线程请求访问任一保护区域时,获取第一变量所处状态,判断第一变量状态是否处于第一状态,如果是,则访问保护区域,并利用第二变量对第一变量进行加锁操作,并将第一变量的状态更改为第二状态,当该线程访问成功后在析构函数中将第一变量的状态更改为第一状态;如果否,则判断访问时间是否超时,若否,则在预设时间后返回获取第一变量所处状态的步骤。

一般情况下,一个程序会有一个主线程和多个任务线程,其中,主线程往往跟界面操作相关,以Windows系统为例,在Windows中界面线程就是主线程,主线程可以调用系统的API(Application Programming Interface,应用程序编程接口)函数创建任务线程来执行分配的任务,例如执行一段代码等。但是在任务线程执行分配的任务的过程中,可能会因为某些原因(例如程序突然被关掉)需要终止任务线程,这时就需要主线程去调用系统API函数关掉任务线程,这种主线程在任务线程的任务还未执行完毕的时候主动去关闭任务线程的操作,即称为杀线程,对于任务线程而言就是被杀掉的情况。并且除了主线程可以终止任务线程之外,任务线程间也可以互相操作来终止对方线程。在现有技术中,如果线程在被杀掉时正在访问被保护的数据,则包含被保护数据的区域处于锁定状态,并且由于线程被杀掉时并未对该区域进行释放或重置处理使得其一直处于锁定状态,使得其他线程无法访问保护区域,导致死锁现象的发生,从而影响程序或系统的正常运行。

但在本实施例中,线程同步方法通过析构函数来保证线程访问任一保护区域成功后将第一变量的状态更改为第一状态,以释放在线程访问过程中对于保护区域的锁定,从而实现及时释放保护区域的目的;并且在当正在访问保护区域的线程被杀掉时,也不会影响析构函数的正常运行,从而避免了由于正在访问保护区域的线程被杀掉而可能导致的死锁现象出现。

并且线程同步方法通过第一变量所处状态来反映保护区域的可访问状态,通过定义第二变量来对第一变量进行加锁以进行保护,并且第一变量和第二变量以指针参数的形式传入所有互斥锁类对象的构造函数中,实现以一个变量的状态来控制所有互斥锁类对象是否可被访问的状态,从而使得所有保护区域的状态处于可控状态,在保护区域的区域较大的情况下,能够有效地解决由于保护区域之间公用变量的耦合导致资源竞争激烈而导致的效率下降问题。

还需要说明的是,一般情况下在将第一变量和第二变量以指针参数形式传入所有互斥锁类对象中之前,需要对第一变量和第二变量的值进行初始化,以保证线程同步方法的正常运行。

另外,当一个线程发起对一个保护区域的访问请求时进行计时作为访问时间,当互斥锁类对象锁定的保护区域均处于不可访问状态时,该线程每隔预设时间重新获取第一变量所处状态以判断保护区域是否处于可访问状态,如果是,立即对保护区域进行访问,如果否,则判断访问时间是否超过规定的超时时间,若访问时间超过超时时间,则认定超时,放弃对保护区域的访问,若访问时间未超过超时时间,则再次等待预设时间后返回获取第一变量所处状态。超时时间可以根据实际情况设定,例如可以是500ms,还可以是600ms或1000ms等,预设时间的取值可以是10ms,也可以是5ms,还可以是15ms。本申请对预设时间的具体取值并不做限定,具体视实际情况而定。

在上述实施例的基础上,在本申请的另一个实施例中,如图3所示,获取第一变量状态包括:

利用查询函数获取第一变量所处状态。

在上述实施例的基础上,在本申请的又一个实施例中,第一变量为布尔型变量,第一状态为False,第二状态为True;

第二变量为线程锁变量。

由于布尔型变量只具有两个值,即True或False,可以很好地与第一变量的两个状态相对应。但在本申请的其他实施例中,第一变量还可以是其他类型的变量,本申请对此并不做限定,具体视实际情况而定。

那么在本实施例中,相应的,利用第二变量对第一变量进行加锁操作,并将第一变量的状态更改为第二状态包括:

利用线程锁变量对第一变量进行加锁操作,以保护第一变量;

将第一变量的状态更改为True。

综上所述,本申请实施例提供了一种线程同步方法,该线程同步方法通过析构函数来保证线程访问任一保护区域成功后将第一变量的状态更改为第一状态,以释放在线程访问过程中对于保护区域的锁定,从而实现及时释放保护区域的目的;并且在当正在访问保护区域的线程被杀掉时,也不会影响析构函数的正常运行,从而避免了由于正在访问保护区域的线程被杀掉而可能导致的死锁现象出现。

并且线程同步方法通过第一变量所处状态来反映保护区域的可访问状态,通过定义第二变量来对第一变量进行加锁以进行保护,并且第一变量和第二变量以指针参数的形式传入所有互斥锁类对象的构造函数中,实现以一个变量的状态来控制所有保护区域是否可被访问的状态,从而实现所有保护区域的状态处于可控状态的目的。

相应的,本申请实施例还提供了一种线程同步系统,如图4所示,包括:

变量定义模块100,用于定义全局变量,全局变量包括第一变量和第二变量,第一变量包括第一状态和第二状态,第二变量用于对第一变量进行加锁操作;

类定义模块200,用于在每个保护区域中新建互斥锁类对象,类包括构造函数、析构函数和用于保存第一变量和第二变量的指针成员变量;

传入模块300,用于将第一变量和第二变量均以指针参数形式传入所有互斥锁类对象的构造函数中,第一变量包括第一状态和第二状态,第一变量所处状态用于标识保护区域是否可被线程访问;;

判断模块400,用于当线程请求访问任一保护区域时,根据第一变量所处状态判断保护区域是否可被访问,在保护区域可被访问时访问保护区域,并在访问成功后在析构函数中更改第一变量所处状态以使保护区域可被访问。

需要说明的是,在现有技术中,当一个线程进入一个保护区域时,编译器或执行器自动生成一个临时变量用来加锁该保护区域,其他线程想要访问该保护区域就会被阻塞,直到之前访问该保护区域的线程访问完毕离开时通过临时变量解锁该保护区域,其他线程才可以访问该保护区域。

在本申请中,第一变量和第二变量以指针参数的形式传入所有互斥锁类对象的构造函数中后,每个互斥锁类对象的构造函数就会进行赋值操作,将第一变量和第二变量均赋值给互斥锁类对象中定义的第一变量指针成员变量和第二变量指针成员变量,完成所述指针成员变量保存所述第一变量和第二变量的操作。第一变量用于标识保护区域的访问状态,当某一线程想要访问任一保护区域时通过第一变量的所处状态来判断该保护区域是否可被访问,在访问过程中利用第二变量对第一变量进行加锁,该加锁操作与现有技术中临时变量对保护区域的加锁操作相同,本申请在此不做赘述。第二变量对第一变量进行加锁操作的目的是避免该线程访问过程中第一变量的状态发生改变,并在线程访问完成后更改第一变量的状态,相当于利用第二变量实现对保护区域的加锁和解锁操作,避免了在线程访问保护区域的过程中被杀掉而导致的死锁现象。

互斥锁类对象为线程同步系统所执行的方法在每个保护区域中的载体,以保证线程同步系统所执行的方法在每个保护区域中的执行;在本申请的其他实施例中,类还包括用于查询第一变量状态的查询函数。

在上述实施例的基础上,在本申请的一个具体实施例中,当第一变量处于第一状态时,所有保护区域处于可被线程访问状态,当第一变量处于第二状态时,所有保护区域处于不可被线程访问状态。

判断模块具体用于,当线程请求访问任一保护区域时,获取第一变量所处状态,判断第一变量状态是否处于第一状态,如果是,则访问保护区域,并利用第二变量对第一变量进行加锁操作,并将第一变量的状态更改为第二状态,当该线程访问成功后在析构函数中将第一变量的状态更改为第一状态;如果否,则判断访问时间是否超时,若否,则在预设时间后返回获取第一变量所处状态的步骤。

一般情况下,一个程序会有一个主线程和多个任务线程,其中,主线程往往跟界面操作相关,以Windows系统为例,在Windows中界面线程就是主线程,主线程可以调用系统的API(Application Programming Interface,应用程序编程接口)函数创建任务线程来执行分配的任务,例如执行一段代码等。但是在任务线程执行分配的任务的过程中,可能会因为某些原因(例如程序突然被关掉)需要终止任务线程,这时就需要主线程去调用系统API函数关掉任务线程,这种主线程在任务线程的任务还未执行完毕的时候主动去关闭任务线程的操作,即称为杀线程,对于任务线程而言就是被杀掉的情况。并且除了主线程可以终止任务线程之外,任务线程间也可以互相操作来终止对方线程。在现有技术中,如果线程在被杀掉时正在访问被保护的数据,则包含被保护数据的区域处于锁定状态,并且由于线程被杀掉时并未对该区域进行释放或重置处理使得其一直处于锁定状态,使得其他线程无法访问保护区域,导致死锁现象的发生,从而影响程序或系统的正常运行。

但在本实施例中,线程同步系统通过析构函数来保证线程访问任一保护区域成功后将第一变量的状态更改为第一状态,以释放在线程访问过程中对于保护区域的锁定,从而实现及时释放保护区域的目的;并且在当正在访问保护区域的线程被杀掉时,也不会影响析构函数的正常运行,从而避免了由于正在访问保护区域的线程被杀掉而可能导致的死锁现象出现。

并且线程同步方法通过第一变量所处状态来反映保护区域的可访问状态,通过定义第二变量来对第一变量进行加锁以进行保护,并且第一变量和第二变量以指针参数的形式传入所有互斥锁类对象的构造函数中,实现以一个变量的状态来控制所有互斥锁类对象是否可被访问的状态,从而使得所有保护区域的状态处于可控状态,在保护区域的区域较大的情况下,能够有效地解决由于保护区域之间公用变量的耦合导致资源竞争激烈而导致的效率下降问题。

还需要说明的是,一般情况下在将第一变量和第二变量以指针参数形式传入所有互斥锁类对象中之前,需要对第一变量和第二变量的值进行初始化,以保证线程同步系统的正常运行。

另外,当一个线程发起对一个互斥锁类对象的访问请求时进行计时作为访问时间,当互斥锁类对象锁定的保护区域均处于不可访问状态时,该线程每隔预设时间重新获取第一变量所处状态以判断保护区域是否处于可访问状态,如果是,立即对保护区域进行访问,如果否,则判断访问时间是否超过规定的超时时间,若访问时间超过超时时间,则认定超时,放弃对保护区域的访问,若访问时间未超过超时时间,则再次等待预设时间后返回获取第一变量所处状态。超时时间可以根据实际情况设定,例如可以是500ms,还可以是600ms或1000ms等,预设时间的取值可以是10ms,也可以是5ms,还可以是15ms。本申请对预设时间的具体取值并不做限定,具体视实际情况而定。

在上述实施例的基础上,在本申请的一个实施例中,判断模块400获取第一变量状态具体用于利用查询函数获取第一变量所处状态。

在上述实施例的基础上,在本申请的又一个实施例中,第一变量为布尔型变量,第一状态为False,第二状态为True;

第二变量为线程锁变量。

由于布尔型变量只具有两个值,即True或False,可以很好地与第一变量的两个状态相对应。但在本申请的其他实施例中,第一变量还可以是其他类型的变量,本申请对此并不做限定,具体视实际情况而定。

那么在本实施例中,相应的,判断模块500利用第二变量对第一变量进行加锁操作,并将第一变量的状态更改为第二状态具体用于利用线程锁变量对第一变量进行加锁操作,以保护第一变量;

将第一变量的状态更改为True。

综上所述,本申请实施例提供了一种线程同步方法及线程同步系统,其中,线程同步方法通过析构函数来保证线程访问任一保护区域成功后将第一变量的状态更改为第一状态,以释放在线程访问过程中对于保护区域的锁定,从而实现及时释放保护区域的目的;并且在当正在访问保护区域的线程被杀掉时,也不会影响析构函数的正常运行,从而避免了由于正在访问保护区域的线程被杀掉而可能导致的死锁现象出现。

并且线程同步方法通过第一变量所处状态来反映保护区域的可访问状态,通过定义第二变量来对第一变量进行加锁以进行保护,并且第一变量和第二变量以指针参数的形式传入所有互斥锁类对象的构造函数中,实现以一个变量的状态来控制所有保护区域是否可被访问的状态,从而实现所有保护区域的状态处于可控状态的目的。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号