CN107741883A - 一种避免线程阻塞的方法、装置及计算机设备 - Google Patents
一种避免线程阻塞的方法、装置及计算机设备 Download PDFInfo
- Publication number
- CN107741883A CN107741883A CN201710911296.6A CN201710911296A CN107741883A CN 107741883 A CN107741883 A CN 107741883A CN 201710911296 A CN201710911296 A CN 201710911296A CN 107741883 A CN107741883 A CN 107741883A
- Authority
- CN
- China
- Prior art keywords
- public
- variables
- thread
- data
- tls
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例提供一种避免线程阻塞的方法、装置及计算机设备,方法包括:为各生产者线程建立相应的公共变量类,公共变量类中包含两个存储器;对公共变量类进行实例化,获取TLS公共变量,并将TLS公共变量存储至预先建立的消费者变量列表中;控制各生产者线程利用相应的TLS公共变量进行写数据;控制消费者线程利用消费者变量列表中所述TLS公共变量进行读取数据;这样就可保证始终只有两个线程发生互斥访问;而由于公共变量类中包含两个存储器,因此可以在两个存储器中分别进行读写操作,这样生产者线程就无需等待消费者线程取数据完毕之后再进行写数据操作,进而避免了生产者线程阻塞,进而提高了程序性能。
Description
技术领域
本发明属于互联网直播技术领域,尤其涉及一种避免线程阻塞的方法、装置及计算机设备。
背景技术
在直播平台的开发过程中,经常会进行消息处理。
在消息处理时,一般会到生产者消费者模式,即使用多个线程获取数据(即“生产者线程”),一个线程从生产者产生的数据块中取出然后处理数据(“消费者线程”)。在这种模式下,必然会碰到的问题是多线程对一个公共变量的互斥读写。并且当线程增多时,易发生阻塞,影响程序性能。
发明内容
针对现有技术存在的问题,本发明实施例提供了一种避免线程阻塞的方法、装置及计算机设备,用于解决现有技术中当利用线程对消息进行处理时,当线程增多时导致线程易发生堵塞,进而影响程序性能的技术问题。
本发明实施例提供一种避免线程阻塞的方法,所述方法包括:
为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;
对所述公共变量类进行实例化,获取线程本地存储(TLS,Thread Local Storage)公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
控制各生产者线程利用相应的所述TLS公共变量进行写数据;
控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据。
上述方案中,所述公共变量类中还包括:成员变量及加锁临界变量。
上述方案中,所述为各生产者线程建立相应的公共变量类,包括:
创建所述公共变量类的写数据函数;
创建所述公共变量类的取数据函数。
上述方案中,所述对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,包括:
利用第一修饰函数ThreadStatic及第二修饰函数static依次对所述公共变量类进行修饰,获取修饰实例;
将所述修饰实例赋值至所述TLS变量,形成所述TLS公共变量。
上述方案中,所述控制各生产者线程利用相应的所述TLS公共变量进行写数据,包括:
获取所述成员变量的数据类型标识;
将所述数据类型标识分别与两个所述存储器的存储标识进行比较,确定第一目标存储器;所述第一目标存储器为存储标识与数据类型标识一致的存储器;
利用写数据函数将待写数据写入所述第一目标存储器中。
上述方案中,所述利用写数据函数将所述待写数据写入所述目标存储器中时,利用所述加锁临界变量对写数据过程进行加锁操作。
上述方案中,所述控制消费者线程利用所述消费者变量列表中所述TLS公共变量进行读取数据,包括:
对所述成员变量进行加锁,将所述成员变量的数据类型标识进行翻转;
根据翻转后的成员变量的数据类型标识确定第二目标存储器,所述第二目标存储器为存储标识与翻转后的数据类型标识一致的存储器;
利用取数据函数从所述第二目标存储器中读取数据;其中,
所述第二目标存储器与第一目标存储器不同。
本发明实施例还提供一种避免线程阻塞的装置,所述装置包括:
建立单元,用于为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;
获取单元,用于对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
第一控制单元,用于控制各生产者线程利用相应的所述TLS公共变量进行写数据;
第二控制单元,用于控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据。
本发明实施例还一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;
对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
控制各生产者线程利用相应的所述TLS公共变量进行写数据;
控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据。
本发明实施例还提供一种避免线程阻塞的计算机设备,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中,
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如上述任一所述的方法。
本发明实施例提供一种避免线程阻塞的方法、装置及计算机设备,所述方法包括:为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;控制各生产者线程利用相应的所述TLS公共变量进行写数据;控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据;如此,为每个生产者线程建立一个公共变量类,这样就可保证始终只有两个线程发生互斥访问;而在发生互斥访问时,由于公共变量类中包含两个存储器,因此可以在两个存储器中分别进行读写操作,这样生产者线程就无需等待消费者线程取数据完毕之后再进行写数据操作,进而避免了生产者线程阻塞,提高了程序的吞吐能力,提高了程序性能。
附图说明
图1为本发明实施例一提供的避免线程阻塞的方法流程示意图;
图2为本发明实施例二提供的避免线程阻塞的装置结构示意图;
图3为本发明实施例三提供的避免线程阻塞的计算机设备结构示意图。
具体实施方式
为了解决现有技术中当利用线程对消息进行处理时,当生产者线程增多时导致线程易发生堵塞,进而影响程序性能的技术问题,本发明实施例提供了一种避免线程阻塞的方法、装置及计算机设备,所述方法包括:为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;控制各生产者线程利用相应的所述TLS公共变量进行写数据;控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据。
下面通过附图及具体实施例对本发明的技术方案做进一步的详细说明。
实施例一
本实施例提供一种避免线程阻塞的方法,如图1所示,所述方法包括:
S101,为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;
为了避免多个生产者线程需要在向同一个数据块进行写数据操作,需要等待,导致生产者线程堵塞,本步骤中为各生产者线程建立相应的公共变量类ProducerData,使得每个生产者线程都对应一个公共变量类ProducerData。
首先定义公共变量类ProducerData,所述公共变量类ProducerData包含两个存储器,可以为DataA和DataB;还包括成员变量bool flag及加锁临界变量Object obj;所述bool为一个数据类型,所述flag为数据类型标识,所述数据类型包括:True,简称T;及Flase,简称F。
然后,创建所述公共变量类ProducerData的写数据函数PushData(T d),以及所述公共变量类ProducerData的取数据函数PopData()。所述写数据函数PushData(T d)将被生产者线程调用,用来向存储器中写入数据。
创建所述公共变量类ProducerData的取数据函数,所述取数据函数PopData()将被消费者线程调用,用来读取存储器中的数据。
S102,对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
本步骤中,公共变量类ProducerData建立好之后,对所述公共变量类进行实例化,获取线程本地存储TLS公共变量。
具体地,利用第一修饰函数ThreadStatic、及第二修饰函数static依次对所述公共变量类进行修饰,获取修饰实例;
将所述修饰实例赋值至所述TLS变量,形成所述TLS公共变量。
并将所述TLS公共变量存储至预先建立的消费者变量列表中,使得数据可以被消费者线程访问到。
S103,控制各生产者线程利用相应的所述TLS公共变量进行写数据;
本步骤中,控制各生产者线程利用相应的所述TLS公共变量进行写数据;具体地,调用TLS公共变量中的写数据函数PushData(T d)进行写数据。
所述写数据函数PushData(T d)的具体实现如下:
根据待写数据获取所述成员变量的数据类型标识flag;将所述数据类型标识分别与两个所述存储器的存储标识进行比较,确定目标存储器;所述目标存储器为存储标识与数据类型标识一致的存储器;
这里,每个存储器具有不同的存储标识,存储标识与所述数据类型标识相对应,因此需要根据数据类型标识来确定第一目标存储器。再利用写数据函数PushData(T d)将所述待写数据写入所述第一目标存储器中。
比如当数据类型标识为T时,就可以根据以下函数来确定存储器:
List<T>DataA,DataB
当DataA的存储标识与数据类型标识T一致时,就可以确定DataA为目标存储器,生产者线程就可以向DataA中写入数据。
这里,利用写数据函数将所述待写数据写入所述目标存储器中时,所述加锁临界变量对写数据过程进行加锁操作。需要说明的是,所述临界变量obj必须是共变量类ProducerData内的变量。
S104,控制消费者线程利用所述消费者变量列表中所述TLS公共变量进行读取数据;
本步骤中,控制消费者者线程利用相应的所述TLS公共变量进行读取数据;具体地,调用TLS公共变量中的取数据函数PopData()进行读取数据。
首先,消费者线程修改数据的加锁,并将所述成员变量的数据类型标识进行翻转。其中,修改后的加锁只被当前消费者线程识别,避免在读取数据的过程中,其他消费者线程争抢数据资源。
而翻转成员变量的数据类型标识是为了使得当前周期的读写操作与下一周期的读写操作是在完全相反的存储器中进行,避免生产者线程发生堵塞。翻转的程序实现如下:
Lock(obj){flag=!flag}
比如,当前周期中,生产者线程在DataA中写数据,那么消费者线程则在DataB中读取数据;当成员变量的数据类型标识翻转后,下一周期中,生产者线程在DataB中写数据,那么消费者线程则在DataA中读取数据。这样,只要成员变量的数据类型标识翻转后,不管消费者线程有没有读取完毕,生产者线程就可以向另一存储器中进行写数据操作,也就是说,生产者线程至多等待一个翻转时间就可以实现写数据操作,降低了生产者线程的等待时间,从而避免了生产者线程阻塞,提高了程序的吞吐能力,进而提高了程序性能。
然后调用取数据函数PopData()进行读取数据,具体地,根据翻转后的成员变量的数据类型标识确定读取数据的第二目标存储器;再利用取数据函数PopData()从第二目标存储器中读取数据,其中,所述第二目标存储器为存储标识与翻转后的数据类型标识一致的存储器;所述第二目标存储器与所述第一目标存储器不同。
比如当数据类型标识为T时,就可以根据以下函数来确定存储器:
List<T>DataA,DataB
当DataB的存储标识与翻转后的数据类型标识一致时,就可以确定DataB为目标存储器,生产者线程就可以向DataB中写入数据。这样就避免同一个数据被同时读写。
当读取数据完毕之后,清空所述第二目标存储器。
实施例二
相应于实施例一,本实施例还提供一种避免线程阻塞的装置,如图2所示,所述装置包括:建立单元21、获取单元22、第一控制单元23及第二控制单元24;其中,
为了避免多个生产者线程需要在向同一个数据块进行写数据操作,需要等待,导致生产者线程堵塞,建立单元21需要为各生产者线程建立相应的公共变量类ProducerData,使得每个生产者线程都对应一个公共变量类ProducerData。
首先定义公共变量类ProducerData,所述公共变量类ProducerData包含两个存储器,可以为DataA和DataB;还包括成员变量bool flag及加锁临界变量Object obj;所述bool为一个数据类型,所述flag为数据类型标识,所述数据类型包括:True,简称T;及Flase,简称F。
然后,创建所述公共变量类ProducerData的写数据函数PushData(T d),以及所述公共变量类ProducerData的取数据函数PopData()。所述写数据函数PushData(T d)将被生产者线程调用,用来向存储器中写入数据。
创建所述公共变量类ProducerData的取数据函数,所述取数据函数PopData()将被消费者线程调用,用来读取存储器中的数据。
当公共变量类ProducerData建立好之后,获取单元22用于对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
具体地,所述获取单元22利用第一修饰函数ThreadStatic、及第二修饰函数static依次对所述公共变量类进行修饰,获取修饰实例;
将所述修饰实例赋值至所述TLS变量,形成所述TLS公共变量。
并将所述TLS公共变量存储至预先建立的消费者变量列表中,使得数据可以被消费者线程访问到。
当获取到TLS公共变量后,第一控制单元21用于控制各生产者线程利用相应的所述TLS公共变量进行写数据。
具体地,第一控制单元21调用TLS公共变量中的写数据函数PushData(T d)进行写数据。
所述写数据函数PushData(T d)的具体实现如下:
根据待写数据获取所述成员变量的数据类型标识flag;将所述数据类型标识分别与两个所述存储器的存储标识进行比较,确定目标存储器;所述目标存储器为存储标识与数据类型标识一致的存储器;
这里,每个存储器具有不同的存储标识,存储标识与所述数据类型标识相对应,因此需要根据数据类型标识来确定第一目标存储器。再利用写数据函数PushData(T d)将所述待写数据写入所述第一目标存储器中。
比如当数据类型标识为T时,就可以根据以下函数来确定存储器:
List<T>DataA,DataB
当DataA的存储标识与数据类型标识T一致时,就可以确定DataA为目标存储器,生产者线程就可以向DataA中写入数据。
这里,利用写数据函数将所述待写数据写入所述目标存储器中时,所述加锁临界变量对写数据过程进行加锁操作。需要说明的是,所述临界变量obj必须是共变量类ProducerData内的变量。
那么第二控制单元24用于控制消费者线程利用所述消费者变量列表中所述TLS公共变量进行读取数据。
具体地,第二控制单元24调用TLS公共变量中的取数据函数PopData()进行读取数据。
首先,消费者线程修改数据的加锁,并将所述成员变量的数据类型标识进行翻转。其中,修改后的加锁只被当前消费者线程识别,避免在读取数据的过程中,其他消费者线程争抢数据资源。
而翻转成员变量的数据类型标识是为了使得当前周期的读写操作与下一周期的读写操作是在完全相反的存储器中进行,避免生产者线程发生堵塞。翻转的程序实现如下:
Lock(obj){flag=!flag}
比如,当前周期中,生产者线程在DataA中写数据,那么消费者线程则在DataB中读取数据;当成员变量的数据类型标识翻转后,下一周期中,生产者线程在DataB中写数据,那么消费者线程则在DataA中读取数据。这样,只要成员变量的数据类型标识翻转后,不管消费者线程有没有读取完毕,生产者线程就可以向另一存储器中进行写数据操作,也就是说,生产者线程至多等待一个翻转时间就可以实现写数据操作,降低了生产者线程的等待时间,从而避免了生产者线程阻塞,提高了程序的吞吐能力,进而提高了程序性能。
然后调用取数据函数PopData()进行读取数据,具体地,根据翻转后的成员变量的数据类型标识确定读取数据的第二目标存储器;再利用取数据函数PopData()从第二目标存储器中读取数据,其中,所述第二目标存储器为存储标识与翻转后的数据类型标识一致的存储器;所述第二目标存储器与所述第一目标存储器不同。
比如当数据类型标识为T时,就可以根据以下函数来确定存储器:
List<T>DataA,DataB
当DataB的存储标识与翻转后的数据类型标识一致时,就可以确定DataB为目标存储器,生产者线程就可以向DataB中写入数据。这样就避免同一个数据被同时读写。
当读取数据完毕之后,清空所述第二目标存储器。
实施例三
本实施例还提供一种避免线程阻塞的计算机设备,如图3所示,所述计算机设备包括:射频(Radio Frequency,RF)电路310、存储器320、输入单元330、显示单元340、音频电路350、WiFi模块360、处理器370、以及电源380等部件。本领域技术人员可以理解,图3中示出的计算机设备结构并不构成对计算机设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
下面结合图3对计算机设备的各个构成部件进行具体的介绍:
RF电路310可用于信号的接收和发送,特别地,将基站的下行信息接收后,给处理器370处理。通常,RF电路310包括但不限于至少一个放大器、收发信机、耦合器、低噪声放大器(Low Noise Amplifier,LNA)、双工器等。
存储器320可用于存储软件程序以及模块,处理器370通过运行存储在存储器320的软件程序以及模块,从而执行计算机设备的各种功能应用以及数据处理。存储器320可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据计算机设备的使用所创建的数据等。此外,存储器320可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
输入单元330可用于接收输入的数字或字符信息,以及产生与计算机设备的用户设置以及功能控制有关的键信号输入。具体地,输入单元330可包括键盘331以及其他输入设备332。键盘331,可收集用户在其上的输入操作,并根据预先设定的程式驱动相应的连接装置。键盘331采集到输出信息后再送给处理器370。除了键盘331,输入单元330还可以包括其他输入设备332。具体地,其他输入设备332可以包括但不限于触控面板、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元340可用于显示由用户输入的信息或提供给用户的信息以及计算机设备的各种菜单。显示单元340可包括显示面板341,可选的,可以采用液晶显示器(LiquidCrystal Display,LCD)、有机发光二极管(Organic Light-Emitting Diode,OLED)等形式来配置显示面板341。进一步的,键盘331可覆盖显示面板341,当键盘331检测到在其上或附近的触摸操作后,传送给处理器370以确定触摸事件的类型,随后处理器370根据输入事件的类型在显示面板341上提供相应的视觉输出。虽然在图3中键盘331与显示面板341是作为两个独立的部件来实现计算机设备的输入和输入功能,但是在某些实施例中,可以将键盘331与显示面板341集成而实现计算机设备的输入和输出功能。
音频电路350、扬声器351,传声器352可提供用户与计算机设备之间的音频接口。音频电路350可将接收到的音频数据转换后的电信号,传输到扬声器351,由扬声器351转换为声音信号输出;
WiFi属于短距离无线传输技术,计算机设备通过WiFi模块360可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图3示出了WiFi模块360,但是可以理解的是,其并不属于计算机设备的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器370是计算机设备的控制中心,利用各种接口和线路连接整个计算机设备的各个部分,通过运行或执行存储在存储器320内的软件程序和/或模块,以及调用存储在存储器320内的数据,执行计算机设备的各种功能和处理数据,从而对计算机设备进行整体监控。可选的,处理器370可包括一个或多个处理单元;优选的,处理器370可集成应用处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等。
计算机设备还包括给各个部件供电的电源380(比如电源适配器),优选的,电源可以通过电源管理系统与处理器370逻辑相连。
本发明实施例提供的避免线程阻塞的方法、装置及计算机设备能带来的有益效果至少是:
本发明实施例提供一种避免线程阻塞的方法、装置及计算机设备,所述方法包括:为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;控制各生产者线程利用相应的所述TLS公共变量进行写数据;控制消费者线程利用所述消费者变量列表中所述TLS公共变量进行读取数据;如此,为每个生产者线程建立一个公共变量类,这样就可保证始终只有两个线程发生互斥访问;而在发生互斥访问时,由于公共变量类中包含两个存储器,因此可以在两个存储器中分别进行读写操作,这样生产者线程就无需等待消费者线程取数据完毕之后再进行写数据操作,进而避免了生产者线程阻塞,提高了程序的吞吐能力,进而提高了程序性能。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP,Digital Signal Processing)来实现根据本发明实施例的网关、代理服务器、系统中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读存储介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供;该程序被处理器执行时实现以下步骤:为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;控制各生产者线程利用相应的所述TLS公共变量进行写数据;控制消费者线程利用所述消费者变量列表中所述TLS公共变量进行读取数据。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种避免线程阻塞的方法,其特征在于,所述方法包括:
为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;
对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
控制各生产者线程利用相应的所述TLS公共变量进行写数据;
控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据。
2.如权利要求1所述的方法,其特征在于,所述公共变量类中还包括:成员变量及加锁临界变量。
3.如权利要求1所述的方法,其特征在于,所述为各生产者线程建立相应的公共变量类,包括:
创建所述公共变量类的写数据函数;
创建所述公共变量类的取数据函数。
4.如权利要求1所述的方法,其特征在于,所述对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,包括:
利用第一修饰函数ThreadStatic及第二修饰函数static依次对所述公共变量类进行修饰,获取修饰实例;
将所述修饰实例赋值至所述TLS变量,形成所述TLS公共变量。
5.如权利要求2所述的方法,其特征在于,所述控制各生产者线程利用相应的所述TLS公共变量进行写数据,包括:
获取所述成员变量的数据类型标识;
将所述数据类型标识分别与两个所述存储器的存储标识进行比较,确定第一目标存储器;所述第一目标存储器为存储标识与数据类型标识一致的存储器;
利用写数据函数将待写数据写入所述第一目标存储器中。
6.如权利要求5所述的方法,其特征在于,所述利用写数据函数将所述待写数据写入所述目标存储器中时,利用所述加锁临界变量对写数据过程进行加锁操作。
7.如权利要求2所述的方法,其特征在于,所述控制消费者线程利用所述消费者变量列表中所述TLS公共变量进行读取数据,包括:
对所述成员变量进行加锁,将所述成员变量的数据类型标识进行翻转;
根据翻转后的成员变量的数据类型标识确定第二目标存储器,所述第二目标存储器为存储标识与翻转后的数据类型标识一致的存储器;
利用取数据函数从所述第二目标存储器中读取数据;其中,
所述第二目标存储器与第一目标存储器不同。
8.一种避免线程阻塞的装置,其特征在于,所述装置包括:
建立单元,用于为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;
获取单元,用于对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
第一控制单元,用于控制各生产者线程利用相应的所述TLS公共变量进行写数据;
第二控制单元,用于控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现以下步骤:
为各生产者线程建立相应的公共变量类,所述公共变量类中包含两个存储器;
对所述公共变量类进行实例化,获取线程本地存储TLS公共变量,并将所述TLS公共变量存储至预先建立的消费者变量列表中;
控制各生产者线程利用相应的所述TLS公共变量进行写数据;
控制消费者线程利用所述消费者变量列表中的所述TLS公共变量进行读取数据。
10.一种避免线程阻塞的计算机设备,其特征在于,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中,
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至7任一所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710911296.6A CN107741883B (zh) | 2017-09-29 | 2017-09-29 | 一种避免线程阻塞的方法、装置及计算机设备 |
PCT/CN2017/107783 WO2019061619A1 (zh) | 2017-09-29 | 2017-10-26 | 一种避免线程阻塞的方法、装置及计算机设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710911296.6A CN107741883B (zh) | 2017-09-29 | 2017-09-29 | 一种避免线程阻塞的方法、装置及计算机设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107741883A true CN107741883A (zh) | 2018-02-27 |
CN107741883B CN107741883B (zh) | 2018-10-23 |
Family
ID=61236432
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710911296.6A Active CN107741883B (zh) | 2017-09-29 | 2017-09-29 | 一种避免线程阻塞的方法、装置及计算机设备 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN107741883B (zh) |
WO (1) | WO2019061619A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110096378A (zh) * | 2019-04-29 | 2019-08-06 | 杭州涂鸦信息技术有限公司 | 一种线程间通信方法及相关装置 |
CN112463412A (zh) * | 2020-12-11 | 2021-03-09 | 中国人寿保险股份有限公司 | 一种线程变量在线程切换过程中复制的方法及相关设备 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101345751A (zh) * | 2007-03-30 | 2009-01-14 | 赛门铁克公司 | 确定作为数据库活动的起源的应用程序用户 |
CN101631328A (zh) * | 2009-08-14 | 2010-01-20 | 北京星网锐捷网络技术有限公司 | 一种对共享资源互斥访问的同步方法、装置和网络设备 |
CN101861568A (zh) * | 2007-09-17 | 2010-10-13 | 通用电气公司 | 用于交换数据的方法和系统 |
CN102023844A (zh) * | 2009-09-18 | 2011-04-20 | 深圳中微电科技有限公司 | 并行处理器及其线程处理方法 |
CN102156630A (zh) * | 2010-01-21 | 2011-08-17 | 微软公司 | 按线程按实例的数据存储 |
US20140089539A1 (en) * | 2012-09-24 | 2014-03-27 | Sap Ag | Lockless Spin Buffer |
CN103914265A (zh) * | 2014-04-09 | 2014-07-09 | 江苏物联网研究发展中心 | 集群细粒度内存管理方法 |
CN104769553A (zh) * | 2013-01-31 | 2015-07-08 | 甲骨文国际公司 | 用于支持集群中的工作共享复用的系统和方法 |
CN104809027A (zh) * | 2015-04-21 | 2015-07-29 | 浙江大学 | 一种基于无锁缓冲区的数据采集方法 |
US20160275010A1 (en) * | 2011-06-21 | 2016-09-22 | Microsoft Technology Licensing, Llc | Dynamically allocated thread-local storage |
CN106445656A (zh) * | 2016-09-06 | 2017-02-22 | 北京邮电大学 | 一种实现线程本地存储的方法及装置 |
-
2017
- 2017-09-29 CN CN201710911296.6A patent/CN107741883B/zh active Active
- 2017-10-26 WO PCT/CN2017/107783 patent/WO2019061619A1/zh active Application Filing
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101345751A (zh) * | 2007-03-30 | 2009-01-14 | 赛门铁克公司 | 确定作为数据库活动的起源的应用程序用户 |
CN101861568A (zh) * | 2007-09-17 | 2010-10-13 | 通用电气公司 | 用于交换数据的方法和系统 |
CN101631328A (zh) * | 2009-08-14 | 2010-01-20 | 北京星网锐捷网络技术有限公司 | 一种对共享资源互斥访问的同步方法、装置和网络设备 |
CN102023844A (zh) * | 2009-09-18 | 2011-04-20 | 深圳中微电科技有限公司 | 并行处理器及其线程处理方法 |
CN102156630A (zh) * | 2010-01-21 | 2011-08-17 | 微软公司 | 按线程按实例的数据存储 |
US20160275010A1 (en) * | 2011-06-21 | 2016-09-22 | Microsoft Technology Licensing, Llc | Dynamically allocated thread-local storage |
US20140089539A1 (en) * | 2012-09-24 | 2014-03-27 | Sap Ag | Lockless Spin Buffer |
CN104769553A (zh) * | 2013-01-31 | 2015-07-08 | 甲骨文国际公司 | 用于支持集群中的工作共享复用的系统和方法 |
CN103914265A (zh) * | 2014-04-09 | 2014-07-09 | 江苏物联网研究发展中心 | 集群细粒度内存管理方法 |
CN104809027A (zh) * | 2015-04-21 | 2015-07-29 | 浙江大学 | 一种基于无锁缓冲区的数据采集方法 |
CN106445656A (zh) * | 2016-09-06 | 2017-02-22 | 北京邮电大学 | 一种实现线程本地存储的方法及装置 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110096378A (zh) * | 2019-04-29 | 2019-08-06 | 杭州涂鸦信息技术有限公司 | 一种线程间通信方法及相关装置 |
CN112463412A (zh) * | 2020-12-11 | 2021-03-09 | 中国人寿保险股份有限公司 | 一种线程变量在线程切换过程中复制的方法及相关设备 |
Also Published As
Publication number | Publication date |
---|---|
WO2019061619A1 (zh) | 2019-04-04 |
CN107741883B (zh) | 2018-10-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106453053B (zh) | 群组消息显示方法及装置 | |
CN105005909A (zh) | 预测流失用户的方法及装置 | |
CN107277029A (zh) | 一种远程过程调用的方法、装置及计算机设备 | |
CN109992400A (zh) | 资源分配方法、装置、移动终端及计算机可读存储介质 | |
CN109992398A (zh) | 资源管理方法、装置、移动终端及计算机可读存储介质 | |
CN104616138A (zh) | 资源转移方法、系统及装置 | |
CN104077184B (zh) | 一种应用程序的进程控制方法及计算机系统 | |
CN105630461A (zh) | 一种android应用界面的管理方法 | |
CN106776036A (zh) | 一种资源分配方法及装置 | |
CN105302427B (zh) | 图像显示方法、装置和电子设备 | |
CN107958365B (zh) | 物料信息变更方法、装置、存储介质及电子设备 | |
CN103543988A (zh) | 队列消息的处理方法、控制消息进入队列的方法及装置 | |
CN106330682A (zh) | 即时通信应用的消息处理方法及移动终端 | |
CN107944000A (zh) | 航班运价更新方法、装置、电子设备、存储介质 | |
CN107743137A (zh) | 一种文件上传方法及装置 | |
CN104519262A (zh) | 获取视频数据的方法、装置及终端 | |
CN105302452A (zh) | 一种基于手势交互的操作方法及装置 | |
CN107276602A (zh) | 射频干扰处理方法、装置、存储介质及终端 | |
CN105991829A (zh) | 一种内容推荐方法及终端 | |
CN107741883A (zh) | 一种避免线程阻塞的方法、装置及计算机设备 | |
CN105847446A (zh) | 一种网络数据的获取方法、装置和系统 | |
CN107066324A (zh) | 一种指纹处理资源的控制方法及设备 | |
CN103455333A (zh) | 一种桌面图标处理方法、装置和移动终端 | |
CN109992399A (zh) | 资源管理方法、装置、移动终端及计算机可读存储介质 | |
CN107479985A (zh) | 一种远程过程调用的方法、装置及计算机设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |