CN104216767B - 多线程之间访问共享数据的方法及装置 - Google Patents
多线程之间访问共享数据的方法及装置 Download PDFInfo
- Publication number
- CN104216767B CN104216767B CN201410478347.7A CN201410478347A CN104216767B CN 104216767 B CN104216767 B CN 104216767B CN 201410478347 A CN201410478347 A CN 201410478347A CN 104216767 B CN104216767 B CN 104216767B
- Authority
- CN
- China
- Prior art keywords
- shared data
- data block
- variable
- global pointer
- recycled
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种多线程之间访问共享数据的方法及装置,其中的方法包括,在当前的共享数据块中新增控制结构和全局指针变量,全局指针变量通过控制结构指向当前的共享数据块;在更新共享数据时,新建共享数据块,采用修改全局指针变量赋值的方式使全局指针变量指向新建的共享数据块;封装多个线程;使封装的线程通过全局指针变量读取共享数据块中的共享数据。利用本发明提供的多线程之间访问共享数据的方法及装置,通过将转发线程对复杂的共享数据的访问转换成对简单变量的访问,从而代替转发线程以锁机制的方式访问复杂的共享数据,能够有效避免转发线程访问共享数据时引起线程阻塞。
Description
技术领域
本发明涉及多线程访问共享数据的技术领域,更为具体地,涉及一种多线程之间访问共享数据的方法及装置。
背景技术
随着cpu多核技术的发展和操作系统的支持,多线程编程已被广泛应用到各种领域的计算机软件实现中。多线程架构模式是目前业界被广泛使用的一种LINUX系统下的用户态程序架构,目前在防火墙产品的网络收发包系统中也应用了这种架构模式,其软件结构如图1所示,系统运行期间,通常创建一个配置线程负责写入数据,同时会存在多个并行运行的转发线程,动态的获取最新的配置数据。对于上述软件结构,配置线程随时可写入配置数据(共享数据),转发线程可随时获取到配置数据,尤其是在类似处理网络报文转发的、实时性要求较高的系统中,读写过程需要尽量在做到互不影响每个线程各自的处理流程。显然传统多线程架构模式下对共享数据的处理限制不能满足上述需求,必须对其进行改进,以达到能够实时读写大块共享数据的要求。
由于是多个转发线程之间对配置数据进行访问,为避免数据读写的混乱,传统的解决方法是,在转发线程读写数据的前后对其进行加解锁的操作,以保证各方能互斥的访问该块数据。但实际情况是,当一个转发线程加锁成功后,其它转发线程只能阻塞在这个锁上,而我们的配置数据量较大且数据结构复杂,这样就会导致加锁时间较长,其它转发线程阻塞的时间也会长。由于防火墙设备处于网络的中间节点,理论上要求转发线程处理网路报文收发的时延越短越好,因此应该尽量避免使用可能导致线程阻塞的机制,传统方法明显不可行。
对传统解决方法稍加改进,采用细化锁粒度的方法,即将传统的用于整块配置数据的大锁分解,拆开成多个更小粒度的小锁,以缩短每次加锁的时间,但对于复杂的配置数据结构,细化成小锁的设计和实现也会相应的复杂很多,况且改进后的实现机制在旧理上也有锁的存在,也会造成转发线程的阻塞,未必会满足转发线程在性能上的要求。
对于上述两种方法,会想到Linux系统下有一种非阻塞锁的机制,如果当前锁被占用,那么想加锁的另一方则尝试加锁时会立即返回失败,线程可以继续运行,这样就避免了线程阻塞在加锁操作上。但这会带来另一方面的问题,即转发线程在读取配置数据之前加锁失败时处于没有配置数据的状态,此时需要在每个转发线程中持续保留一份旧的配置数据,以便在读取最新配置数据失败时使用,这必然会浪费大量的内存,而且在转发线程加锁期间,也需要有将最新的配置数据更新到本地保留的配置数据的处理,不仅锁的粒度较大,而且加锁时间也较长,会影响到配置线程更新配置数据及其它转发线程读取最新配置数据的及时性。
而抛开锁机制,是利用数据库系统共享配置数据的方式,即配置线程将配置数据更新到数据库中,各转发线程需要配置时,直接从数据库中读取,利用数据库系统本身对并发访问的支持解决多个转发线程之间共享配置数据的问题。但该方法需要在现有的系统中引入数据库模块,重新设计配置数据的逻辑结构以及在数据库中的存储结构,这样不仅修改量大,而且对于数据库的更新及查询也会对系统性能带来一定的影响。
为了避免锁机制,还有一种通用的技术,通过本地socket通讯在不同转发线程之间传递共享数据,但我们的配置数据不仅数据量较大,而且其数据存储结构中包含多级链表,如果要使用socket通讯传递,则必须要在发送方将多级的结构转换成线性结构,然后接收方再将线性结构还原成多级结构,这种转换过程明显增加了程序实现的复杂性,也会对处理性能带来较大的影响。
综上所述,现有的技术或方案都存在一定的缺陷,无法解决多个转发线程阻塞的问题,因此,需要一种全新的能够让多个转发线程无阻赛访问复杂的配置数据的技术方案。
发明内容
鉴于上述问题,本发明的目的是提供一种多线程之间访问共享数据的方法及装置,以解决多个转发线程采用锁机制并行访问共享数据,导致多个转发线程阻塞的问题。
本发明提供的多线程之间访问共享数据的方法,包括共享数据更新阶段和共享数据读取阶段;其中,
共享数据更新阶段,包括:
在当前的共享数据块中新增控制结构和全局指针变量;其中,控制结构用于访问共享数据块中的共享数据;全局指针变量通过控制结构指向当前的共享数据块;
在更新共享数据时,新建共享数据块;修改全局指针变量的赋值,使全局指针变量通过控制结构从指向当前的共享数据块变为指向新建的共享数据块;
共享数据读取阶段,包括:
封装多个线程;
封装后的多个线程通过全局指针变量读取全局指针变量指向的共享数据块中的共享数据。
本发明提供的多线程之间访问共享数据的装置,包括:
控制结构新增单元,用于在当前的共享数据块中新增控制结构,控制结构用于访问共享数据块中的共享数据;
全局指针变量新增单元,用于在当前的共享数据块中新增全局指针变量,全局指针变量通过控制结构指向当前的共享数据块;
共享数据块新建单元,用于在更新共享数据时,新建共享数据块;
指针指向改变单元,用于通过修改全局指针变量的赋值,使全局指针变量通过控制结构从指向当前的共享数据块变为指向新建的共享数据块;
线程封装单元,用于封装多个线程;
共享数据读取单元,用于使封装后的多个线程通过全局指针变量读取全局指针变量指向的共享数据块中的共享数据。
利用上述根据本发明提供的多线程之间访问共享数据的方法及装置,通过将转发线程对复杂的共享数据的访问转换成对简单变量的访问,从而代替转发线程以锁机制的方式访问复杂的共享数据,能够有效避免转发线程访问共享数据时引起线程阻塞。
为了实现上述以及相关目的,本发明的一个或多个方面包括后面将详细说明并在权利要求中特别指出的特征。下面的说明以及附图详细说明了本发明的某些示例性方面。然而,这些方面指示的仅仅是可使用本发明的旧理的各种方式中的一些方式。此外,本发明旨在包括所有这些方面以及它们的等同物。
附图说明
通过参考以下结合附图的说明及权利要求书的内容,并且随着对本发明的更全面理解,本发明的其它目的及结果将更加明白及易于理解。在附图中:
图1为多线程架构示意图;
图2为根据本发明实施例的多线程之间访问共享数据的方法的流程示意图;
图3为根据本发明实施例的转发线程读取共享数据的流程示意图;
图4为根据本发明实施例的资源回收超时机制的流程示意图;
图5为根据本发明实施例的数据交互示意图;
图6为根据本发明实施例的多线程之间访问共享数据的装置的逻辑结构示意图;
图7为根据本发明实施例的多线程之间访问共享数据的装置的一个具体实施方式的逻辑结构示意图。
在所有附图中相同的标号指示相似或相应的特征或功能。
具体实施方式
在下面的描述中,出于说明的目的,为了提供对一个或多个实施例的全面理解,阐述了许多具体细节。然而,很明显,也可以在没有这些具体细节的情况下实现这些实施例。在其它例子中,为了便于描述一个或多个实施例,公知的结构和设备以方框图的形式示出。
现有技术中,转发线程并行访问共享数据是以锁机制的方式进行访问的,容易引起转发线程间的阻塞,为了实现转发线程对共享数据的无锁访问机制,本发明利用操作系统的原子操作机制,即对简单变量的赋值和读取操作都是原子性的,将转发线程对共享数据的访问过程转化成原子操作,以保证转发线程读写共享数据过程的时序不会出现错乱,因此,转发线程可以采用原子性的操作方式代替锁机制的方式完成读写共享数据的工作,转发线程不采用锁机制访问共享数据也就不会造成转发线程间的阻塞。
由于在C语言中简单变量的操作(如赋值、读取)都是原子性的,因此,本发明将C语言中简单变量的操作应用到对共享数据的处理中,改变现有的共享数据结构。
需要说明的是,共享数据等同于配置数据,线程等同于转发线程,多线程也就是多个转发线程。
以下将结合附图对本发明的具体实施例进行详细描述。
图2示出了根据本发明实施例的多线程之间访问共享数据的方法的流程。
如图2所示,本发明实施例提供的根据本发明实施例的多线程之间访问共享数据的方法,包括共享数据更新阶段和共享数据读取阶段,其中,
在共享数据更新阶段中,包括:
步骤S201:在当前的共享数据块中新增控制结构和全局指针变量;其中,控制结构用于访问共享数据块中的共享数据;全局指针变量通过控制结构指向当前的共享数据块。
共享数据块中的共享数据是以多层结构的形式组成的,每一层结构包括多张表,由于在后续步骤中需要指针变量指向共享数据块中的表,而指针变量无法同时指向多张表,所以需要在共享数据块中增加一层控制结构,用来访问共享数据块中的多张表。
转发线程会通过全局指针变量指向该控制结构访问共享数据块中的多张表,也就是读取共享数据块中的共享数据,在为了方便表述,将全局指针变量通过控制结构指向共享数据块简称为全局指针变量指向共享数据块。
步骤S201为更新共享数据的预处理阶段,用于改变共享数据的结构。
步骤S202:在更新共享数据时,新建共享数据块;修改全局指针变量的赋值,使全局指针变量通过控制结构从指向当前的共享数据块变为指向新建的共享数据块;并清除全局指针变量旧指向的共享数据块。
在新建共享数据块后,通过修改全局指针变量的值,将全局指针变量从指向旧的共享数据块变为指向新建的共享数据块,转发线程从读取全局指针变量旧指向的共享数据块中的共享数据变为读取全局指针变量新指向的共享数据块中的共享数据。
在每次更新共享数据时,都会创建新的共享数据块,全局指针变量指向该新建的共享数据块,在更新完共享数据后,全局变量指针旧指向的共享数据块便成为过期的共享数据块,不会再次用到,共享数据每更新一次,便会多出一个共享数据块,这样经过多次更新操作后,系统便会积累过多的过期的共享数据块,在没有配置更新的大多数场景下,为了保证系统只有一个共享数据块,因此需要一种回收共享数据块的机制,及时释放过期的共享数据块所占用的内存资源。
本发明提供的回收共享数据块的机制为:
在启动配置线程时,设置一个待回收资源池,用来存放过期的共享数据块,在待回收资源池回收过期的共享数据块后,需要对待回收资源池进行清理,具体地,清理待回收资源池为清理待回收资源池内的共享数据块,及时释放共享数据块所占用的内存资源。
为保证待回收资源池中的共享数据块及时得到清理,本发明选择以下两个时间清理待回收资源池:
第一时间:将全局指针变量旧指向的共享数据块移入待回收资源池后立即清理一次待回收资源池;
第二时间:通过设置一个周期,定期清理待回收资源池,本发明优选将转发线程读取一次共享数据时的最长时间作为周期,每经过一个周期,清理一次待回收资源池。以保证第一时间共享数据块所占用的未被释放的内存资源有机会再次释放。
在待回收资源池清理共享数据块的过程中,具体地清理共享数据块的过程为:根据共享数据块当前的状态,判断共享数据块是否正在被转发线程使用,如果共享数据块正在被转发线程使用,需要待转发线程使用完共享数据块后,释放共享数据块所占用的内存;如果共享数据块未被转发线程使用,则不需要等待,直接释放共享数据块所占用的内存。共享数据块的状态是通过引用计数器的值确定的,引用计数器的值大于零,表示该共享数据块正在被转发线程使用或即将被转发线程使用,引用计数器的值等于零,表示该共享数据块当前没有被转发线程使用,处于未被使用状态,只有未被使用的共享数据块才可以立即释放其所占用的内存资源。
需要说明的是,在全局指针变量指向新建的共享数据块后,立刻将旧指向的共享数据块移入待回收资源池,也就是说,每次更新共享数据块后,新指向的共享数据块会变成旧指向的共享数据块,立刻将其移入待回收资源池。
上述内容详细说明了如何利用全局指针变量改变共享数据的结构,以及如何通过全局指针变量更新共享数据块中的共享数据的过程,在更新完共享数据后,需要转发线程读取更新后的共享数据,下面将对转发线程读取更新后的共享数据做详细说明。
在读取共享数据阶段中,包括:
步骤S203:封装转发线程读取共享数据的接口。
由于转发线程可以不通过新增的全局指针变量读到共享数据,因此,本发明采用封装的方法将转发线程读取共享数据的操作封装成统一接口,所有转发线程只能调用该接口读取共享数据。
步骤S204:封装后的接口通过全局指针变量读取全局指针变量指向的共享数据块中的共享数据;在某一时刻,全局指针变量指向的可能是旧共享数据块,也可能是新建的共享数据块。
在全局指针变量改变指向之前,转发线程读取到的是全局指针变量旧指向的共享数据块中的共享数据,也就是更新前的共享数据块中的共享数据,在全局指针变量指向新的共享数据块之后,转发线程读取到的是新的共享数据块中共享数据,也就是更新后的共享数据块中的共享数据,因此,转发线程不会因读不到共享数据而阻塞,保证了共享数据的更新过程不会影响转发线程正常的流量处理。
另外,由于配置线程通过全局指针变量更新共享数据,而转发线程通过全局指针变量读取共享数据,因此全局指针变量相当于共享的全局指针变量。
由于在全局指针变量指向新建的共享数据块后,全局指针变量旧指向的共享数据块会被移入待回收资源池,因此,如果在这之前转发线程正在读取共享数据,则在这之后转发线程读取共享数据块的过程实际上是在待回收资源池进行的。
在转发线程读取共享数据时还需考虑一个问题,保证转发线程每次读取到的共享数据的前后一致性,即,需要保证转发线程使用全局指针变量期间不能被更新共享数据所中断,转发线程使用全局指针变量的操作越少越好,为此,本发明需要在转发线程读取共享数据的流程中做一些改进。
图3示出了根据本发明实施例的转发线程读取共享数据的流程。
如图3所示,本发明实施例提供的转发线程读取共享数据的流程,包括:
步骤S301:在全局指针变量指向的共享数据块中设置引用计数器。
步骤S302:将指向共享数据块的全局指针变量赋值到每个转发线程的局部指针变量。
在将指向共享数据块的全局指针变量赋值到每个转发线程的局部指针变量后,每个转发线程的局部指针变量指向共享数据块,之后转发线程通过局部指针变量读取共享数据块。
步骤S303:在全局指针变量赋值到转发线程的局部指针变量后,将共享数据块中设置的引用计数器加一。
引用计数器用于标记共享数据块的状态,引用计数器的初始值为零,引用计数器加一,此时引用计数器的值大于零,表示当前转发线程正在或将要读取共享数据块中的共享数据。
步骤S304:在转发线程读取共享数据块中的共享数据后,将共享数据块中设置的引用计数器减一。
同一时刻可能有多个转发线程会读取共享数据,每个转发线程读取时都会将计数器加一,读完后做减一操作,因此减一操作之后,计数器的值不一定为零,因为有可能其它的转发线程还正在读取,当所有的转发线程读取完共享数据后,此时引用计数器的值回到零,表示当前转发线程已读取完共享数据块中的共享数据。
上述步骤S301~步骤S304通过将全局指针变量赋值给局部指针变量的方式实现共享数据块的读取,针对全局指针变量仅做了一次简单的读取操作,这样就和前述的配置线程对全局指针变量的赋值操作对应起来,保证了对该共享的全局指针变量在不同线程中操作的原子性。
另外,共享数据的资源回收在配置线程中完成,读取共享数据是在转发线程中完成,由于配置线程和转发线程并行运行于同一系统,因此不同线程的处理流程可能被其它线程的处理中断。例如,当转发线程将全局变量指针值读到局部变量后,此时如果被配置线程的资源回收处理中断,由于转发线程还未将共享数据块的引用计数增加,因此配置线程会认为该数据块为未使用状态,会直接释放数据块资源,导致后续转发线程继续后续的步骤时,读取到的是错误的数据。
为了解决上述问题,本发明针对转发线程回收资源过程提供了一种超时处理机制,图4示出了根据本发明实施例的资源回收超时机制的流程,如图4所示,本发明实施例提供的资源回收超时机制的流程,包括:
步骤S401:判断共享数据块是否为使用状态;如果是,执行步骤S405;如果否,执行步骤S402。
首先,配置线程判断共享数据块的使用状态,如果共享数据块为未使用状态时,执行步骤S405;如果共享数据块为使用状态,则执行步骤S402。
步骤S402:启动定时器,设定等待时间。
根据定时器设定一个等待时间,等待时间大于或等于转发线程读取全局变量指针和增加引用计数值两个操作完成的总时间,也就是步骤S302和步骤S303的总时长。
步骤S403:到达定时器设定的等待时间时,再次判断共享数据块是否为使用状态;如果是,执行步骤S405;如果否,执行步骤S404。
当经过定时器设定的等待时间后,再次判断共享数据块的使用状态,如果仍为未使用状态,才能进行释放共享数据块资源的操作,如果仍为使用状态,则结束资源回收超时机制的流程。
步骤S404:释放共享数据块资源。
步骤S405:结束。
上述步骤S401~步骤S405详细描述了本发明实施例提供的资源回收超时机制的流程,能够解决转发线程和配置线程之间的操作会互相干扰的问题,
由于在资源回收超时机制中未使用锁机制,因此不影响转发线程的运行效率。
上述步骤S201~S205详细说明了本发明实施例提供的多线程之间访问共享数据的方法,该方法从更新共享数据阶段和转发线程读取共享数据阶段做出改进。
为了更直观地说明本发明提供的多线程之间访问共享数据的方法,图5示出了根据本发明实施例的数据交互的过程,如图5所示,首先对共享数据结构进行预处理,在原共享数据块上层新增控制结构,同时新增全局指针变量,通过控制结构指向共享数据块,共享数据块是由链表组成的,为了方便表述,共享数据块等同于链表。
在更新共享数据时,新建链表,将全局指针变量指向新建的链表,通过设置一个待回收资源池回收全局指针变量旧指向的链表,并定期清理待回收资源池内的链表,释放链表所占用的内存资源。
在转发线程读取共享数据时,将全局指针变量赋值到转发线程的局部指针变量,此时,设置在链表中的引用计数器加一,在转发线程读取共享数据后,引用计数器减一,以保证对全局指针变量在不同线程中访问的原子性。
与上述方法相对应,本发明还提供一种多线程之间访问共享数据的装置。图6示出了根据本发明实施例的多线程之间访问共享数据的装置的逻辑结构。
如图6所示,本发明提供的本发明实施例提供的多线程之间访问共享数据的装置,包括控制结构新增单元610、全局指针变量新增单元620、共享数据块新建单元630、指针指向改变单元640、线程封装单元650、共享数据读取单元660。
其中,控制结构新增单元610用于在当前的共享数据块中新增控制结构,访问当前的共享数据块中的共享数据。
全局指针变量新增单元620用于在当前的共享数据块中新增全局指针变量,通过控制结构指向当前的共享数据块。
共享数据块新建单元630用于在更新共享数据时,新建共享数据块。
指针指向改变单元640用于通过修改全局指针变量的赋值,使全局指针变量通过控制结构从指向当前的共享数据块变为指向新建的共享数据块。
线程封装单元650用于封装多个线程。
共享数据读取单元660用于使封装后的多个线程通过全局指针变量读取全局指针变量指向的共享数据块中的共享数据。
图7示出了根据本发明实施例的多线程之间访问共享数据的装置的一个具体实施方式的逻辑结构。如图7所示,该装置还包括共享数据块清除单元670,用于在全局指针变量通过控制结构指向新建的共享数据块后,清除全局指针变量旧指向的共享数据块。
共享数据块清除单元670包括待回收资源池创建模块671和待回收资源池清理模块672。
其中,待回收资源池创建模块671用于创建待回收资源池,存放全局指针变量旧指向的共享数据块,待回收资源池清理模块672,用于清理待回收资源池内的共享数据块。
在每次更新共享数据时,全局指针变量通过控制结构指向新建的共享数据块后,将全局指针变量旧指向的共享数据块移入待回收资源池,待回收资源池清理模块672清理待回收资源池内的共享数据块。
其中,在待回收资源池清理模块672清理待回收资源池内共享数据块的时间为:在将全局指针变量旧指向的共享数据块移入待回收资源池时立刻清理待回收资源池中的共享数据块或将线程读取一次共享数据时的最长时间作为周期,根据该周期清理待回收资源池中的共享数据块。
另外,在待回收资源池清理模块672清理待回收资源池中的共享数据块的过程中,在共享数据块的状态为未使用时,清理共享数据块;在共享数据块的状态为使用时,待共享数据块的使用状态变为未使用状态时,清理共享数据块。
再者,在共享数据读取单元660使封装后的多个线程通过全局指针变量读取全局指针变量指向的共享数据块中的共享数据的过程中,在全局指针变量指向的共享数据块中设置初始值为零的引用计数器,将指向共享数据块的全局指针变量赋值到每个线程的局部指针变量后,共享数据块中设置的引用计数器加一,当引用计数器值大于零时,标识局部指针变量指向的共享数据块为使用状态;在每个线程读取共享数据块中的共享数据后,共享数据块中设置的引用计数器减一,当引用计数器值为零时,标识局部指针变量指向的共享数据块为未使用状态。
上述详细地描述了本发明提供的多线程之间访问共享数据的方法及装置,通过将转发线程对复杂的共享数据的访问转换成对简单变量的访问,从而代替转发线程以锁机制的方式访问复杂的共享数据,能够有效避免转发线程访问共享数据时引起线程阻塞。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (10)
1.一种多线程之间访问共享数据的方法,包括共享数据更新阶段和共享数据读取阶段;其中,
所述共享数据更新阶段,包括:
在当前的共享数据块中新增控制结构和全局指针变量;其中,所述控制结构用于访问所述共享数据块中的共享数据;所述全局指针变量通过所述控制结构指向当前的共享数据块;
在更新共享数据时,新建共享数据块;修改所述全局指针变量的赋值,使所述全局指针变量通过所述控制结构从指向当前的共享数据块变为指向新建的共享数据块;
所述共享数据读取阶段,包括:
封装多个线程;
封装后的多个线程通过所述全局指针变量读取所述全局指针变量指向的共享数据块中的共享数据;以及,
判断所述共享数据块是否为使用状态;如果所述共享数据块为未使用状态,释放共享数据块所占用的内存资源;如果所述共享数据块为使用状态,启动定时器,并设定等待时间,当所述定时器到达设定的等待时间时,再次判断所述共享数据块是否为使用状态,在所述共享数据块为未使用状态时,释放所述共享数据块所占用的内存资源。
2.如权利要求1所述的多线程之间访问共享数据的方法,在所述全局指针变量通过所述控制结构指向新建的共享数据块后,清除所述全局指针变量旧指向的共享数据块;其中,在清除所述全局指针变量旧指向的共享数据块的过程中,
创建待回收资源池;用于存放所述全局指针变量旧指向的共享数据块;将所述全局指针变量旧指向的共享数据块移入所述待回收资源池,并清理所述待回收资源池内的共享数据块。
3.如权利要求2所述的多线程之间访问共享数据的方法,其中,清理待回收资源池内的共享数据块的时间,包括:
在将所述全局指针变量旧指向的共享数据块移入所述待回收资源池时,立刻清理所述待回收资源池中的共享数据块或将线程读取一次共享数据时的最长时间作为周期,根据所述周期清理所述待回收资源池内的共享数据块。
4.如权利要求3所述的多线程之间访问共享数据的方法,其中,在清理待回收资源池内的共享数据块的过程中,
在所述共享数据块的状态为未使用时,清理所述共享数据块;在所述待回收资源池内的共享数据块的状态为使用时,待所述共享数据块的使用状态变为未使用状态时,清理所述共享数据块。
5.如权利要求4所述的多线程之间访问共享数据的方法,其中,在封装后的多个线程通过所述全局指针变量读取所述全局指针变量指向的共享数据块中的共享数据的过程中,
在所述全局指针变量指向的共享数据块中设置初始值为零的引用计数器,将所述全局指针变量赋值到每个线程的局部指针变量后,所述局部指针变量指向的共享数据块中设置的引用计数器加一,当所述引用计数器值大于零时,标识所述局部指针变量指向的共享数据块为使用状态;
在每个线程读取所述局部指针变量指向的共享数据块中的共享数据后,所述局部指针变量指向的共享数据块中设置的引用计数器减一;当所述引用计数器值为零时,标识所述局部指针变量指向的共享数据块为未使用状态。
6.一种多线程之间访问共享数据的装置,包括:
控制结构新增单元,用于在当前的共享数据块中新增控制结构,所述控制结构用于访问所述共享数据块中的共享数据;
全局指针变量新增单元,用于在当前的共享数据块中新增全局指针变量,所述全局指针变量通过所述控制结构指向当前的共享数据块;
共享数据块新建单元,用于在更新共享数据时,新建共享数据块;
指针指向改变单元,用于通过修改所述全局指针变量的赋值,使所述全局指针变量通过所述控制结构从指向当前的共享数据块变为指向新建的共享数据块;
线程封装单元,用于封装多个线程;
共享数据读取单元,用于使封装后的多个线程通过所述全局指针变量读取所述全局指针变量指向的共享数据块中的共享数据;以及,判断所述共享数据块是否为使用状态;如果所述共享数据块为未使用状态,释放共享数据块所占用的内存资源;如果所述共享数据块为使用状态,启动定时器,并设定等待时间,当所述定时器到达设定的等待时间时,再次判断所述共享数据块是否为使用状态,在所述共享数据块为未使用状态时,释放共享数据块所占用的内存资源。
7.如权利要求6所述的多线程之间访问共享数据的装置,还包括共享数据块清除单元,用于在所述全局指针变量通过所述控制结构指向新建的共享数据块后,清除所述全局指针变量旧指向的共享数据块;所述共享数据块清除单元包括:
待回收资源池创建模块,用于创建待回收资源池,存放所述全局指针变量旧指向的共享数据块;
待回收资源池清理模块,用于清理所述待回收资源池;
在每次更新共享数据时,所述全局指针变量指向新建的共享数据块后,将所述全局指针变量旧指向的共享数据块移入所述待回收资源池,待回收资源池清理模块清理所述待回收资源池内的共享数据块。
8.如权利要求7所述的多线程之间访问共享数据的装置,其中,所述待回收资源池清理模块清理待回收资源池内的共享数据块的时间,包括:
在将所述全局指针变量旧指向的共享数据块移入所述待回收资源池时,立刻清理所述待回收资源池中的共享数据块或将线程读取一次共享数据时的最长时间作为周期,根据所述周期清理所述待回收资源池中的共享数据块。
9.如权利要求8所述的多线程之间访问共享数据的装置,其中,在所述待回收资源池清理模块清理待回收资源池中的共享数据块的过程中,
在所述共享数据块的状态为未使用时,清理所述共享数据块;在所述待回收资源池内的共享数据块的状态为使用时,待所述共享数据块的使用状态变为未使用状态时,清理所述共享数据块。
10.如权利要求9所述的多线程之间访问共享数据的装置,其中,在共享数据读取单元使封装后的多个线程通过所述全局指针变量读取所述全局指针变量指向的共享数据块中的共享数据的过程中,
在所述全局指针变量指向的共享数据块中设置初始值为零的引用计数器,将所述全局指针变量赋值到每个线程的局部指针变量后,所述局部指针变量指向的共享数据块中设置的引用计数器加一,当所述引用计数器值大于零时,标识所述局部指针变量指向的共享数据块为使用状态;
在每个线程读取所述局部指针变量指向的共享数据块中的共享数据后,所述局部指针变量指向的共享数据块中设置的引用计数器减一;当所述引用计数器值为零时,标识所述局部指针变量指向的共享数据块为未使用状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410478347.7A CN104216767B (zh) | 2014-09-18 | 2014-09-18 | 多线程之间访问共享数据的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410478347.7A CN104216767B (zh) | 2014-09-18 | 2014-09-18 | 多线程之间访问共享数据的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104216767A CN104216767A (zh) | 2014-12-17 |
CN104216767B true CN104216767B (zh) | 2017-10-31 |
Family
ID=52098292
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410478347.7A Active CN104216767B (zh) | 2014-09-18 | 2014-09-18 | 多线程之间访问共享数据的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104216767B (zh) |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105406999A (zh) * | 2015-11-20 | 2016-03-16 | 福建星网锐捷安防科技有限公司 | 一对多数据分发方法和分发设备 |
CN107153653B (zh) * | 2016-03-03 | 2020-06-26 | 阿里巴巴集团控股有限公司 | 一种分库分表的轮询访问方法及装置 |
CN106445656B (zh) * | 2016-09-06 | 2019-10-11 | 北京邮电大学 | 一种实现线程本地存储的方法及装置 |
CN106776016B (zh) * | 2016-11-28 | 2020-08-11 | 硅谷数模半导体(北京)有限公司 | 应用程序处理方法和装置 |
US20180232304A1 (en) * | 2017-02-16 | 2018-08-16 | Futurewei Technologies, Inc. | System and method to reduce overhead of reference counting |
US20180260255A1 (en) * | 2017-03-10 | 2018-09-13 | Futurewei Technologies, Inc. | Lock-free reference counting |
CN107562523A (zh) * | 2017-09-04 | 2018-01-09 | 北京国华世纪电子科技有限公司 | 一种多任务嵌入式系统共享数据管理方法 |
CN108197270B (zh) * | 2018-01-04 | 2021-05-28 | 中科边缘智慧信息科技(苏州)有限公司 | 分布式文件系统数据回收方法 |
CN108563511A (zh) * | 2018-02-28 | 2018-09-21 | 南京邮电大学 | 一种多线程计数操作控制方法 |
CN109271193B (zh) * | 2018-10-08 | 2023-01-13 | 广州市百果园信息技术有限公司 | 一种数据处理方法、装置、设备及存储介质 |
CN109614220B (zh) * | 2018-10-26 | 2020-06-30 | 阿里巴巴集团控股有限公司 | 一种多核系统处理器和数据更新方法 |
CN109634762B (zh) * | 2018-12-19 | 2021-06-18 | 北京达佳互联信息技术有限公司 | 一种数据回收方法、装置、电子设备及存储介质 |
CN110569131B (zh) * | 2019-08-22 | 2022-03-15 | 北京华捷艾米科技有限公司 | 一种信号量管理系统及信号量管理方法 |
CN111475264B (zh) * | 2020-02-28 | 2023-05-12 | 新华三技术有限公司合肥分公司 | 一种用户态无锁转发的实现方法及装置 |
CN111723250B (zh) * | 2020-05-22 | 2024-03-08 | 长沙新弘软件有限公司 | 一种基于引用计数的链表管理方法 |
CN113778674A (zh) * | 2021-08-31 | 2021-12-10 | 上海弘积信息科技有限公司 | 一种负载均衡设备配置管理在多核下的免锁实现方法 |
CN114338390B (zh) * | 2022-03-10 | 2022-07-12 | 广东统信软件有限公司 | 一种服务器配置方法、计算设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1534478A (zh) * | 2003-03-27 | 2004-10-06 | �Ҵ���˾ | 重定位在多线程计算机中共享的计算机数据的设备和方法 |
CN101093450A (zh) * | 2006-06-19 | 2007-12-26 | 迈普(四川)通信技术有限公司 | 一种多cpu互斥的方法 |
CN101631328A (zh) * | 2009-08-14 | 2010-01-20 | 北京星网锐捷网络技术有限公司 | 一种对共享资源互斥访问的同步方法、装置和网络设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6862635B1 (en) * | 1998-11-13 | 2005-03-01 | Cray Inc. | Synchronization techniques in a multithreaded environment |
-
2014
- 2014-09-18 CN CN201410478347.7A patent/CN104216767B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1534478A (zh) * | 2003-03-27 | 2004-10-06 | �Ҵ���˾ | 重定位在多线程计算机中共享的计算机数据的设备和方法 |
CN101093450A (zh) * | 2006-06-19 | 2007-12-26 | 迈普(四川)通信技术有限公司 | 一种多cpu互斥的方法 |
CN101631328A (zh) * | 2009-08-14 | 2010-01-20 | 北京星网锐捷网络技术有限公司 | 一种对共享资源互斥访问的同步方法、装置和网络设备 |
Also Published As
Publication number | Publication date |
---|---|
CN104216767A (zh) | 2014-12-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104216767B (zh) | 多线程之间访问共享数据的方法及装置 | |
US20210397551A1 (en) | Numa-aware garbage collection | |
CN104111897B (zh) | 一种数据处理方法、装置及计算机系统 | |
DE102020133262A1 (de) | Arbeitslastscheduler für Speicherzuweisung | |
CN106385329B (zh) | 资源池的处理方法、装置和设备 | |
US10140208B2 (en) | NUMA-aware garbage collection | |
DE102006019839A1 (de) | Zeitbewusste Systeme | |
CN106528065B (zh) | 一种线程获取方法及设备 | |
CN105103136B (zh) | 共享和受管的存储器统一访问 | |
CN108459898A (zh) | 一种资源回收方法及装置 | |
CN105975327A (zh) | 在虚拟环境下减小虚拟机的抢占的方法和计算机系统 | |
US8595726B2 (en) | Apparatus and method for parallel processing | |
CN112905365B (zh) | 一种数据处理方法、装置、设备及介质 | |
CN110532197A (zh) | 内存回收方法及装置、电子设备、存储介质 | |
CN105094751A (zh) | 一种用于流式数据并行处理的内存管理方法 | |
CN111414256A (zh) | 基于麒麟移动操作系统的应用程序进程派生方法、系统及介质 | |
CN106681836A (zh) | 一种信号量的创建方法及装置 | |
CN105550029A (zh) | 一种进程调度方法及装置 | |
CN109343956A (zh) | 一种操作系统配置方法及装置 | |
IL264794B2 (en) | Scheduling of tasks on a multi-processor device | |
CN108345452A (zh) | 一种线程管理方法及装置 | |
CN114116197A (zh) | 可编程逻辑器件及其内存管理系统 | |
CN106855845A (zh) | 堆空间的内存分配管理系统及嵌入式芯片 | |
CN107341049A (zh) | 一种事务处理的优化处理方法及装置 | |
CN107291371B (zh) | 一种读写锁的实现方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |