CN103617025A - 基于数据隔离避免线程冲突的方法 - Google Patents
基于数据隔离避免线程冲突的方法 Download PDFInfo
- Publication number
- CN103617025A CN103617025A CN201310608202.XA CN201310608202A CN103617025A CN 103617025 A CN103617025 A CN 103617025A CN 201310608202 A CN201310608202 A CN 201310608202A CN 103617025 A CN103617025 A CN 103617025A
- Authority
- CN
- China
- Prior art keywords
- data
- thread
- function
- trnascription
- static
- 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
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及多线程应用技术领域,具体涉及一种不破坏并发性能的基于数据隔离避免线程冲突的方法。本发明的应用范围是在多线程中被并发调用且需要存储状态的功能,可以解决其线程冲突的问题。本发明使用的技术手段是数据隔离,数据隔离的方法是将功能引用的静态数据按可能使用该数据的线程数量分解为数据集合,并将数据集合中的数据副本分别分配给调用此功能的各个线程使用。本发明可避免线程冲突,保证功能线程安全,有效提高线程的并发性能,并可实现跨平台操作。
Description
技术领域
本发明涉及多线程应用技术领域,具体涉及一种不破坏并发性能的基于数据隔离避免线程冲突的方法。
背景技术
随着计算机技术的发展,硬件的性能得到了巨大的提高,使得多线程的应用越来越广泛。使用多线程可以使得多个执行路径并行执行,降低了程序开发的复杂度,提高了软件的性能,尤其是在多处理器系统上,多线程的软件程序可以充分利用处理器资源,获得更好的性能。
随之而来的一个问题是,有时,某个功能在被多次使用时,需要记住上次调用的状态,例如某个累加结果等,这样就需要一个或一组静态数据来存储该状态。所谓的“静态数据”,是指在运行过程中一直存在的状态数据,在编程语言中一般体现为全局变量(对象)或静态变量(对象)。设想该功能在多个线程中被使用的情况,并行的功能访问静态的数据,彼此随时都会被对方打断,如果恰巧都在访问静态数据(例如都在写入),就会使该静态数据进入不一致的状态,导致错误的运行结果。如果某个功能具有这种特性,就称该功能为非线程安全的。而没有使用静态数据而仅使用局部变量的功能,在多线程中被执行时就不会造成错误状态,就被称为线程安全的。
解决上述问题目前通常使用的方法是为功能所依赖的静态数据提供一个配套的锁,当准备对数据进行读写操作前,就对锁执行加锁操作,此时如果锁已经处于被加锁状态,该线程就进入等待状态,直到锁被解锁才继续执行;当结束一组操作后,再把锁解锁。这样就可以保证静态的状态数据不会处于不一致的状态。这样,这一功能在不同线程被调用时,就不会造成错误,此时称该功能为线程安全的。
然而,通过加锁实现的线程安全是以两个线程彼此等待为代价的,这样就破坏了线程的并行特性,降低了程序的执行性能。在极端的情况下,如果两个或者多个线程一直需要使用某个共享资源,就会退化为串行的状态,完全失去了多线程处理的意义,反而还会因为操作系统线程调度的开销而得到低于单线程程序的性能。
此外,由于不同的操作系统提供的加锁和解锁操作各有不同,使得对数据的加锁和解锁要考虑不同操作系统的差异而采取不同的实现,又给实现程序的跨平台特性带来了一定的困难。
发明内容
为解决上述问题,本发明提供了一种基于数据隔离避免线程冲突的方法,可在保证线程安全的同时提高线程的并发性。
本发明的应用范围是在多线程中被并发调用且需要存储状态的功能,可以解决其线程冲突的问题。本发明使用的技术手段是数据隔离,数据隔离的方法是将功能引用的静态数据按可能使用该数据的线程数量分解为数据集合,并将数据集合中的数据副本分别分配给调用此功能的各个线程使用。
本发明采用的技术方案如下:
一种基于数据隔离避免线程冲突的方法,包括如下步骤:
(1)确定无需共享的静态数据集合:判断执行进程中各功能对应的静态数据是否需在各线程间共享,选定无需共享的静态数据集合;对于需要在各个线程间共享的数据,不适合使用数据隔离的方法,这类数据使用原始的加锁操作。
(2)创建数据副本:根据调用某功能的线程数,为该功能所使用的非共享静态数据创建相应数量的数据副本;
(3)分配数据副本:在线程与数据副本间建立对应关系;
(4)读写操作:各线程根据对应关系调用相应数据副本进行读写操作。
具体的,根据调用该功能的线程数能否预先确定,步骤(2)分以下两种方式操作:
①线程数能预先确定,静态创建数据副本:将该功能对应的静态数据改为数组,数组成员数为调用此功能的线程数,数组成员为各个数据副本;
②线程数不能预先确定,动态创建数据副本:将该功能对应的静态数据改为数据映射表,其key类型为线程ID,value类型为静态数据的数据类型。数据映射表作为存储数据副本及线程与数据副本映射关系的容器,在开始时并不包含数据副本,当线程使用此静态数据时,动态创建一个数据副本,并存入线程与该数据副本的映射关系。下次使用如果还是该线程,则能从映射表中找到其数据副本,直接调用,如果不是该线程,则再动态创建数据副本并生成映射关系。
具体的,根据线程数能否预先确定以及上述数据副本创建方式,步骤(3)选择相应方式分配数据副本:
①静态分配数据副本:为该功能函数增加一个参数,静态数据和调用该功能的线程函数也增加该参数,根据参数值给某一线程分配对应的数据副本;该参数表示其对应的数据副本在数组中的索引,根据参数完成线程与相应数据副本的对应。
②动态分配数据副本:获取当前线程的ID号,根据数据映射表查找与之对应的数据副本,若有则直接分配使用,若没有则创建一个数据副本,并将当前线程的ID号与该数据副本的映射关系存入数据映射表。
本发明的优点如下:
1、本发明根据调用功能的线程数使用数据隔离技术将不需共享的静态数据分解,各自进行读写操作,可避免线程冲突,保证功能线程安全。
2、在某个功能使用的静态数据比较多而且对静态数据的操作比较密集的情况下,使用本发明所描述的方法可以使多线程应用由目前的加锁方案接近串行的执行状态改进为完全并行或大部分并行的执行状态,有效提高线程的并发性能。
3、相对于目前使用的给静态数据加锁的解决方案,本方案描述的方法不依赖于任何与操作系统平台有关的特性,因而不会给程序的跨平台特性带来任何损失。
附图说明
图1是本发明实施方式的流程图。
具体实施方式
一种基于数据隔离避免线程冲突的方法,包括如下步骤:
(1)确定无需共享的静态数据集合:判断执行进程中各功能对应的静态数据是否需在各线程间共享,选定无需共享的静态数据集合;对于需要在各个线程间共享的数据,不适合使用数据隔离的方法,这类数据使用原始的加锁操作。
(2)创建数据副本:
根据调用某功能的线程数能否预先确定,分以下两种方式创建:
①线程数能预先确定,静态创建数据副本:将该功能对应的静态数据改为数组,数组成员数为调用此功能的线程数,数组成员为各个数据副本;以C++语言为例,假设有一个静态数据int a,程序功能被5个线程使用,则将该数据改为int a[5]。
②线程数不能预先确定,动态创建数据副本:将该功能对应的静态数据改为数据映射表,其key类型为线程ID,value类型为静态数据的数据类型。以C++语言为例,假设有一个静态数据int a,则将该数据改为std::map<THREAD_ID, int> a; THREAD_ID为程序所在系统平台的线程ID类型。
(3)分配数据副本:
根据线程数能否预先确定以及上述数据副本创建方式,选择相应方式分配数据副本,在线程与数据副本间建立对应关系。
①静态分配数据副本:为该功能函数增加一个参数,静态数据和调用该功能的线程函数也增加该参数,根据参数值给某一线程分配对应的数据副本;该参数表示其对应的数据副本在数组中的索引,根据参数完成线程与相应数据副本的对应。例如,有一个功能函数void doWork(),则可将其修改为void doWork(int index)。如果doWork中使用了数据a,则改为a[index]。同样,调用该函数的线程函数如果引用了静态数据,则也为该函数增加一个index参数,并修改其中使用静态数据的代码为使用数组中对应的数据。此过程修改代码量比较多,若必要,可开发一种软件工具来扫描代码并自动修改。
②动态分配数据副本:获取当前线程的ID号,根据数据映射表查找与之对应的数据副本,若有则直接分配使用,若没有则创建一个数据副本,并将当前线程的ID号与该数据副本的映射关系存入数据映射表。例如,有一个线程,其ID为1000,需要使用数据a。则到数据映射表a中查找key为1000的数据副本,如果有则直接使用,如果没有则在a中创建key为1000的数据副本并使用该数据副本。
(4)读写操作:各线程根据对应关系调用相应数据副本进行读写操作。
Claims (3)
1.一种基于数据隔离避免线程冲突的方法,其特征在于包括如下步骤:
(1)确定无需共享的静态数据集合:判断执行进程中各功能对应的静态数据是否需在各线程间共享,选定无需共享的静态数据集合;
(2)创建数据副本:根据调用某功能的线程数,为该功能所使用的非共享静态数据创建相应数量的数据副本;
(3)分配数据副本:在线程与数据副本间建立对应关系;
(4)读写操作:各线程根据对应关系调用相应数据副本进行读写操作。
2.根据权利要求1所述的于数据隔离避免线程冲突的方法,其特征在于:根据调用该功能的线程数能否预先确定,步骤(2)分以下两种方式操作:
①线程数能预先确定,静态创建数据副本:将该功能对应的静态数据改为数组,数组成员数为调用此功能的线程数,数组成员为各个数据副本;
②线程数不能预先确定,动态创建数据副本:将该功能对应的静态数据改为数据映射表,其key类型为线程ID,value类型为静态数据的数据类型。
3.根据权利要求2所述的于数据隔离避免线程冲突的方法,其特征在于:根据数据副本创建方式,步骤(3)选择相应方式分配数据副本:
①静态分配数据副本:为该功能函数增加一个参数,静态数据和调用该功能的线程函数也增加该参数,根据参数值给某一线程分配对应的数据副本;
②动态分配数据副本:获取当前线程的ID号,根据数据映射表查找与之对应的数据副本,若有则直接分配使用,若没有则创建一个数据副本,并将当前线程的ID号与该数据副本的映射关系存入数据映射表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310608202.XA CN103617025B (zh) | 2013-11-27 | 2013-11-27 | 基于数据隔离避免线程冲突的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310608202.XA CN103617025B (zh) | 2013-11-27 | 2013-11-27 | 基于数据隔离避免线程冲突的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103617025A true CN103617025A (zh) | 2014-03-05 |
CN103617025B CN103617025B (zh) | 2017-03-08 |
Family
ID=50167728
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310608202.XA Active CN103617025B (zh) | 2013-11-27 | 2013-11-27 | 基于数据隔离避免线程冲突的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103617025B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115118508A (zh) * | 2022-06-28 | 2022-09-27 | 平安银行股份有限公司 | 数据管理方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060225031A1 (en) * | 2001-09-28 | 2006-10-05 | Petersen Paul M | Method and apparatus for accessing thread-privatized global storage objects |
CN101556534A (zh) * | 2009-04-21 | 2009-10-14 | 浪潮电子信息产业股份有限公司 | 一种众核结构的大规模数据并行计算方法 |
CN101593131A (zh) * | 2008-05-28 | 2009-12-02 | 国际商业机器公司 | 基于对象池来实现线程操作的方法和设备 |
CN101685408A (zh) * | 2008-09-24 | 2010-03-31 | 国际商业机器公司 | 多个线程并行访问共享数据结构的方法及装置 |
-
2013
- 2013-11-27 CN CN201310608202.XA patent/CN103617025B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060225031A1 (en) * | 2001-09-28 | 2006-10-05 | Petersen Paul M | Method and apparatus for accessing thread-privatized global storage objects |
CN101593131A (zh) * | 2008-05-28 | 2009-12-02 | 国际商业机器公司 | 基于对象池来实现线程操作的方法和设备 |
CN101685408A (zh) * | 2008-09-24 | 2010-03-31 | 国际商业机器公司 | 多个线程并行访问共享数据结构的方法及装置 |
CN101556534A (zh) * | 2009-04-21 | 2009-10-14 | 浪潮电子信息产业股份有限公司 | 一种众核结构的大规模数据并行计算方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115118508A (zh) * | 2022-06-28 | 2022-09-27 | 平安银行股份有限公司 | 数据管理方法、装置、电子设备及存储介质 |
CN115118508B (zh) * | 2022-06-28 | 2023-09-19 | 平安银行股份有限公司 | 数据管理方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103617025B (zh) | 2017-03-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107113341B (zh) | 用于数据划分的分布式关系数据库管理系统中事务的高吞吐量处理的系统 | |
DE102013022299B3 (de) | Schutz globaler Register in einem Multithreaded-Prozessor | |
US9086911B2 (en) | Multiprocessing transaction recovery manager | |
CN104424030B (zh) | 多进程操作共享内存的方法和装置 | |
US9141540B2 (en) | Garbage collection of interned strings | |
CN106681836B (zh) | 一种信号量的创建方法及装置 | |
CN107341054B (zh) | 任务执行方法、装置及计算机可读存储介质 | |
CN105045632A (zh) | 一种多核环境下实现免锁队列的方法和设备 | |
US10360079B2 (en) | Architecture and services supporting reconfigurable synchronization in a multiprocessing system | |
US20190232891A1 (en) | Vehicle Control Device | |
CN111459691A (zh) | 共享内存的读写方法及装置 | |
Sharma et al. | A competitive analysis for balanced transactional memory workloads | |
US20060224949A1 (en) | Exclusion control method and information processing apparatus | |
CN101685406A (zh) | 用于对数据结构的实例进行操作的方法和系统 | |
CN103631831B (zh) | 一种数据备份方法及装置 | |
CN102209016A (zh) | 一种数据处理方法、装置和数据处理系统 | |
CN103617025A (zh) | 基于数据隔离避免线程冲突的方法 | |
US20130086013A1 (en) | System and method of saving files to a version control system ("vcs") repository | |
US8473954B2 (en) | Executing operations via asynchronous programming model | |
CN112346879B (zh) | 进程管理方法、装置、计算机设备及存储介质 | |
CN113961364A (zh) | 一种大规模锁系统实现方法、装置、存储介质和服务器 | |
Bertout et al. | A heuristic to minimize the cardinality of a real-time task set by automated task clustering | |
KR101448861B1 (ko) | 동기적 메시지 기반 대량 병렬처리 시스템 | |
US9002897B2 (en) | Aspected interfaces and methods for synchronized containers and other data structures | |
CN114064297A (zh) | 一种数据库行锁的处理方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |