CN102156630A - 按线程按实例的数据存储 - Google Patents
按线程按实例的数据存储 Download PDFInfo
- Publication number
- CN102156630A CN102156630A CN2011100271461A CN201110027146A CN102156630A CN 102156630 A CN102156630 A CN 102156630A CN 2011100271461 A CN2011100271461 A CN 2011100271461A CN 201110027146 A CN201110027146 A CN 201110027146A CN 102156630 A CN102156630 A CN 102156630A
- Authority
- CN
- China
- Prior art keywords
- thread
- index value
- data
- sign
- identified
- 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
- 238000013500 data storage Methods 0.000 title description 20
- 238000000034 method Methods 0.000 claims abstract description 59
- 230000003068 static effect Effects 0.000 claims description 52
- 238000006243 chemical reaction Methods 0.000 claims description 2
- 238000010586 diagram Methods 0.000 description 12
- 230000008569 process Effects 0.000 description 9
- 238000005516 engineering process Methods 0.000 description 7
- 230000007246 mechanism Effects 0.000 description 7
- 230000008859 change Effects 0.000 description 4
- 238000003825 pressing Methods 0.000 description 4
- 230000006870 function Effects 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 238000004883 computer application Methods 0.000 description 2
- 239000012141 concentrate Substances 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000011156 evaluation Methods 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 238000009432 framing Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000008521 reorganization Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Images
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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
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)
- Devices For Executing Special Programs (AREA)
Abstract
一种存储按线程、按实例的数据的方法,包括标识对应于第一实例的唯一索引值,基于所标识的索引值来标识类型参数,以及基于所标识的类型参数来实例化通用持有者对象。该通用持有者对象包括被配置成存储对于第一实例是本地的按线程数据的线程本地字段。
Description
技术领域
本发明涉及计算机应用开发,尤其涉及一种计算机应用开发中的数据存储。
背景
软件程序从软件开发开始的日子起就被编写为顺序地运行。计算机随着时间不断变得更加强大,具有更多的处理能力和存储器来处理高级操作。这一趋势最近从日益增长的单处理器时钟速率转向增加单个计算机中可用处理器的数量,这导致相应的从顺序执行转向并行执行。软件开发者想要利用计算机处理能力上的改进来使他们的软件程序能够在采用新硬件时运行得更快。采用并行硬件,软件开发者安排特定软件程序的一个或多个任务并行地(也称为并发地)执行,以使例如同一逻辑运算可以同时利用多个处理器,由此在向该软件在其上运行的计算机添加更多处理器时提供更好的性能。
概述
提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
一个实施例利用包含线程静态字段的通用持有者实例,并且在运行时以实现快速的按线程、按实例的存储的方式来动态地参数化该通用持有者实例。在一个实施例中,通用类型的实例化被用作实现按实例、按线程的数据存储的机制。
一个实施例提供了一种存储按线程、按实例的数据的方法,包括标识对应于第一实例的独特索引值,基于所标识的索引值来标识类型参数,以及基于所标识的类型参数来实例化通用持有者对象。该通用持有者对象包括被配置成存储第一实例本地的按线程的数据的线程本地字段。
附图简述
包括附图来提供对各实施例的进一步理解,且这些附图被合并在本发明书内并构成其一部分。附图示出各实施例,并且与说明书一起用于解释本发明的原理。其他实施例和各实施例的许多预期优点将随着参考下面的详细描述进行更好的理解而得到认识。附图的元素不一定相对于彼此而缩放。相同的附图标记指代对应的类似部分。
图1是示出根据一个实施例的适于执行按线程、按实例的数据存储应用程序的计算设备的图示。
图2是根据一个实施例的用于在图1所示的计算设备上操作的按线程、按实例的数据存储应用程序的图示。
图3是根据一个实施例的存储按线程、按实例的数据的方法的流程图。
图4是根据另一实施例的存储按线程、按实例的数据的方法的流程图。
图5是根据一个实施例的标识独特索引值的方法的流程图。
图6是根据一个实施例的生成用于存储按线程、按实例的数据的持有者的方法的流程图。
详细描述
在以下详细描述中,对附图进行了参考,附图构成了实施例的一部分且在其中作为示例示出了可在其中实践本发明的各特定实施例。可以理解,可以使用其它实施例并且可以做出结构上或逻辑上的改变而不背离本发明的范围。因此,以下详细描述并不旨在限制,并且本发明的范围由所附权利要求来限定。
一个实施例提供了用于按线程、按实例的数据的存储的数据存储应用程序,但此处所描述的技术和方法还满足除这些以外的其他目的。在一个实现中,此处所描述的一个或多个技术可被实现为诸如微软框架等框架程序内的、或在任何其它类型的程序或服务内的特征。
现有解决方案提供了全局数据(即,静态数据)以及与特定线程相关联的数据(即,线程本地数据、或线程静态数据、或按线程的数据)的数据存储和检索。例如,类可包括静态成员,并且该类的所有实例将共享该静态成员的相同的值(即,静态成员表示全局数据)。对于线程本地变量,每一线程基本上具有其自己的该变量的副本。存在其中数据不仅应按线程地存储而且应按实例地存储的情形。对于按实例的数据,类可包括非静态成员,并且该类的每一单独实例可存储该非静态成员的不同的值。在托管框架中用于支持按线程、按实例的数据存储的现有机制常常是极其昂贵的。一个实施例提供了利用按线程的存储机制并且具有与其同等的性能的按线程、按实例的数据存储的解决方案。一个实施例提供了使用线程静态特性的本地线程且基于实例的存储的系统和方法。
在微软框架中,System.ThreadStaticAttribute(系统线程静态属性)提供了快速且支持即时(Just in Time,JIT)编译器的机制,用于存储静态变量中的按线程的数据。当线程静态属性被置于静态成员上时,该成员被作为线程本地成员来对待。另外,在.NET框架中的通用类型或类为用于实例化通用实例的每一通用参数类型集合维护一单独的静态字段。一个实施例利用了这些事实,利用包含ThreadStatic(线程静态)静态字段的通用持有者实例,并且在运行时以实现快速的按线程、按实例的存储的方式来动态地参数化这些通用持有者实例。在一个实施例中,通用类型实例化被用作实现按实例、按线程的数据存储的机制。在一个实施例中,通用类型静态数据持有者被回收以供将来的实例使用,并且当达到通用限制时系统回退到用于按实例、按线程的数据存储的现有的较慢的机制。
一个实施例是基于.NET执行环境中的两个事实:(1)当ThreadStaticAttribute(线程静态属性)被应用于静态字段时,该字段对访问它的每一线程维护一不同的值;以及(2)在通用类型中,静态字段应用于用于参数化该通用类型的特定的类型集合。例如,考虑在以下伪码示例I中给出的类型或类:
伪码示例I
public class MyHolder<T>{public static string Data;}
public class FirstType{}
public class SecondType{}
对于伪码示例I中给出的类型,字段MyHolder<FirstType>.Data将不同于字段MyHolder<SecondType>.Data。在一个实施例中,ThreadStaticAttribute被应用于通用类型的静态成员,并且随后该通用类型用多个T参数来参数化。对于所提供的每一新类型参数,获得不同的ThreadStatic字段。在一个实施例中,创建该通用的参数化类型的实例,所创建的每一ThreadLocal(线程本地)实例具有一不同的参数集。尽管ThreadStatic成员是静态的且由该类型的所有实例所共享,但一个实施例给予每个ThreadLocal实例该通用持有者的独特的且没有其他ThreadLocal实例共享的参数化版本,由此,实际上使得ThreadStatic静态特性改为是实例成员。
图1是示出根据一个实施例的适于执行按线程、按实例的数据存储应用程序的计算设备100的图示。在所示的实施例中,计算系统或计算设备100包括多个处理单元102和系统存储器104。取决于计算设备的精确配置和类型,存储器104可以是易失性(如RAM)、非易失性(诸如ROM、闪存等)或两者的结合。
计算设备100还可具有附加的特征/功能。例如,计算设备100还可包含附加存储(可移动和/或不可移动),包括但不限于磁盘、光盘或磁带。这样的附加存储在图1中由可移动存储108和不可移动存储110示出。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等的任何合适的方法或技术实现的易失性和非易失性、可移动和不可移动介质。存储器104、可移动存储108和不可移动存储110都是计算机存储介质的示例(例如,存储用于执行方法的计算机可执行指令的计算机可读存储介质)。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁性存储设备、或能用于存储所需信息且可以由计算设备100访问的任何其它介质。任何这样的计算机存储介质都可以是计算设备100的一部分。
计算设备100包括允许计算设备100与其它计算机/应用程序115通信的一个或多个通信连接114。计算设备100还可包括诸如键盘、定点设备(例如,鼠标)、笔、语音输入设备、触摸输入设备等的输入设备112。计算设备100还可包括诸如显示器、扬声器、打印机等的输出设备111。
在一个实施例中,计算设备100包括按线程、按实例的数据存储应用程序200。数据存储应用程序200在以下参考图2进一步详细描述。
图2是根据一个实施例的用于在图1所示的计算设备100上操作的按线程、按实例的数据存储应用程序200的图示。应用程序200是驻留在计算设备100上的应用程序之一。然而,应用程序200可另选地或另外地被具体化为一个或多个计算机上的计算机可执行指令和/或与图1所示的不同变型。另选地或另外地,应用程序200的一个或多个部分可以是系统存储器104的一部分、可以在其它计算机和/或应用程序115上、或可以是计算机软件领域的技术人员能想到的其它合适的此类变型。
数据存储应用程序200包括程序逻辑202,其负责执行在此描述的一些或全部技术。程序逻辑202包括用于实例化线程本地对象的逻辑204;用于标识索引值的逻辑206;用于基于所标识的索引值来标识类型参数的逻辑208;用于基于所标识的类型参数来实例化通用持有者对象的逻辑210;用于创建哑类型的数组的逻辑212;用于确定实例的总数是否超出预定阈值的逻辑214;用于通过向线程分配数据槽来提供按线程、按实例的数据存储的逻辑216;以及用于操作该应用程序的其他逻辑218。
现在转向图3-6,将更详细地描述用于实现数据存储应用程序200的一个或多个实施例的技术。在某些实现中,图3-6示出的技术至少部分地在计算设备100的操作逻辑中实现。
图3是根据一个实施例的存储按线程、按实例的数据的方法300的流程图。在方法300中的302,标识对应于第一实例的独特索引值。在304,基于所标识的索引值来标识类型参数。在一个实施例中,所标识的类型参数对第一实例是独特的,并且不被其他实例同时共享(即,根据一个实施例,其他实例可在稍后使用相同的参数,只要没有其他实例在相同时间正同时使用这些参数)。在306,基于所标识的类型参数来实例化通用持有者对象,其中通用持有者对象包括线程本地字段,该字段被配置成存储对于第一实例是本地的按线程的数据。根据一个实施例,线程本地字段通过将线程静态属性应用于静态变量来创建。在一个实施中,方法300中的标识独特索引值(302)、标识类型参数(304)、以及实例化通用持有者对象(306)由至少一个处理器来执行。
图4是根据另一实施例的存储按线程、按实例的数据的方法400的流程图。在方法400中的402,创建哑类型的数组。在404,实例化线程本地对象,由此生成第一实例。在406,标识对应于第一实例的独特索引值。在408,基于所标识的索引值从哑类型的数组中标识类型参数。在一个实施例中,所标识的类型参数对于第一实例是独特的,并且不被其他实例同时共享。在410,基于所标识的类型参数来实例化通用持有者对象,其中通用持有者对象包括线程本地字段,该字段被配置成存储对于第一实例是本地的按线程的数据。在412,对多个实例中的每一实例重复方法400中的实例化线程本地对象(404)、标识独特索引值(406)、标识类型参数(408)、以及实例化通用持有者对象(410)。在414,确定多个实例中的实例总数是否超出预定阈值。在416,当实例的总数超出预定阈值时,将数据槽分配给线程用于存储按线程、按实例的数据。
在一个实施例中,方法400中的第一实例包括引用通用持有者对象的第一字段以及存储索引值的第二字段。根据一个实施例,方法400中的线程本地字段通过将线程静态属性应用于静态变量来创建。
图5是根据一个实施例的示出标识独特索引值(例如,分别在图3和4中的框302和406)的方法500的流程图。在方法500中的502,提供用于存储索引值的静态变量。在504,每次生成新实例时,如果数据结构(见508)不包含任何索引值,则更新静态变量。在一个实施例中,如果数据结构包含至少一个索引值,则在504不更新静态变量。在506,标识先前使用但不再使用的索引值。在508,将所标识的先前使用的索引值存储在数据结构中。在一个实施例中,在调用实例最终化器时将索引值存储在数据结构中,这在无用信息收集器检测到该对象不再被使用并且收集该对象时发生。还可在用户通过调用其Dispose(处置)方法来明确地指示ThreadLocal<T>将不再被使用时,将索引值存储在数据结构中。在510,如果数据结构当前正存储至少一个索引值,则从该数据结构中选择独特索引值。在512,如果数据结构当前没有正存储至少一个索引值,则基于静态变量选择独特索引值。在一个实施例中,该独特索引值是以10为基数的数字。在514,将表示独特索引值的以10为基数的数字转换成具有不同基数的数字(例如,以16为基数的数字)。根据一个实施例,所选择的基数是基于用于参数化通用持有者的类型的数量来预测的(例如,如果使用16个哑类型来参数化,则将选择基数16)。在516,基于具有不同基数的数字来标识类型参数。
现在将参考伪码示例更详细地描述图3-5所示的且以上所讨论的方法。在以下示例中,上述线程本地对象与“ThreadLocal<T>”类或类型的实例相对应。在一个实施例中,ThreadLocal<T>的实例存储若干字段,包括在以下伪码示例II中所示的两个:
伪码示例II
private HolderBase m_holder;
private int m_currentInstanceIndex;
如伪码示例II中所示,ThreadLocal<T>的每一实例包括HolderBase(持有者基础)字段和索引字段。HolderBase是实际T数据生存的地方,它被包装在装箱(boxed)实例中,如以下伪码示例III中所示:
伪码示例III
HolderBase是用于允许ThreadLocal<T>为数据使用多个存储机制的抽象类。例如,从HolderBase派生的类可以使用Thread.GetData/SetData(线程取得数据/设置数据)方法来存储T,如以下伪码示例IV所示:
伪码示例IV
一个实施例使用从HolderBase派生的通用类型来提供更快的实现,如以下伪码示例V所示:
伪码示例V
在伪码示例V中,装箱T被直接存储到ThreadStatic静态成员中,这比使用伪码示例IV中所示的Thread.GetData/SetData更快,因为CLR(公共语言运行库)提供了与将数据存储到非ThreadStatic静态特性类似的这一功能的优化实现。然而,每一GenericHolder<U,V,W>仅有一个静态s_value。基于实例的存储可通过为要使用的每一个独特的s_value创建GenericHolder的不同通用实例化(具有不同的U、V和W类型)来提供。在一个实施例中,这通过检索可用类型的数组来完成(例如,通过在ThreadLocal<T>在其中生存的汇编件(assembly)上反射,以及取得该汇编件中的所有引用类型的列表)。在另一实施例中,这通过创建出于此目的的特定哑类型集合来实现,如以下伪码示例VI所示:
伪码示例VI
来自伪码示例VI中给出的列表中的类型可用于参数化GenericHolder<U,V,W>。在一个实施例中,基于指定索引来检索来自该列表的类型,如以下伪码示例VII所示:
伪码示例VII
伪码示例VII中的索引用于计算对应于每一U、V、W的唯一类型组合,随后它可用于实例化GenericHolder<U,V,W>。在一个实施例中,每个ThreadLocal<T>得到它自己的独特索引,这通过为所创建的每个新的ThreadLocal<T>维护原子地更新的静态整数变量来完成。在一个实施例中,如果先前使用但当前不使用的索引值是可用的,或者如果已经超出限制,则不发生静态整数变量的更新。根据一个实施例,伪码示例VII中的代码将以10为基数的索引值映射到用于标识类型U、V、W的集合的以16为基数的数字。
对于具有三个类型参数(即,U、V、W)的GenericHolder的情况,伪码示例VII中的TYPE_DIMENSIONS(类型维数)的值将是3。如果改为将GenericHolder创建成GenericHolder<U,V,W,X>,则TYPE_DIMENSIONS的值将是4。独特索引的数量是s_dummyTypes.Length(静态哑类型长度)的TYPE_DIMENSIONS次幂。由此,对于以上示例,可以存在GenericHolder<U,V,W>的16^3(即,4096)个独特实例。
GenericHolder的独特实例的数量可通过添加更多哑类型和/或增加类型维度的数量来增加。然而,存在由此引起的某些潜在问题。在某一点,如果创建了足够的ThreadLocal<T>实例,则系统将用完可用索引(如以上所暗示的,假定在一个实施例中由于哑类型的数量和类型维度的数量而存在硬编码的限制)。在一个实施例中,这通过从不再使用的ThreadLocal<T>实例中集中这些索引来解决。当ThreadLocal<T>不再被使用时(这可通过最终化或通过实例的明确处置来检测),其索引被添加到维护所有先前使用但当前不使用的索引的共享的线程安全数据结构(例如,并发栈)中。当新的ThreadLocal<T>被实例化时,首先检查该数据结构以查看是否存在任何这样的可用索引,以及如果存在,则取得它并且使用它。如果不存在任何这样的可用索引,则检查先前引用且为所创建的每个新的ThreadLocal<T>实例原子地更新的共享整数变量,并且只要该变量的值低于最大值,则该值被递增并且被用作该新实例的索引。
由于使运行时环境实例化以不同方式且为不同的T值所参数化的太多GenericHolder<U,V,W>实例所引起的可能的存储器消耗问题,根据一个实施例的系统还对跨所有类型所创建的通用持有者总数实施最大值。这在一个实施例中通过维护另一全局计数来实现,该全局计数用于指示已经执行了多少独特的通用实例化。在一个实施例中,如果全局计数的值达到最大值,则系统回退到不是基于通用实例化的较慢的实现(在一个实施例中,如果系统可得到未使用的池以外的索引,则该系统仍将使用较快的实现),
根据一个实施例,在回退的情况下使用TLSHolder,如伪码示例IV所示。这启用无限数量的ThreadLocal<T>实例(至多达由于诸如存储器等系统资源所允许的隐式最大值),其中,大多数实例基于通用实例化在快路径上执行,但在太多ThreadLocal<T>实例都被创建为同时运行的情形下,那些剩余的仍可起作用,但在一个实施例中将采用较慢方案。
在一个实施例中,HolderBase(从其中派生TLSHolder和GenericHolder<U,V,W>)存储装箱实例,它包装T实例而不是直接存储T。这样做存在几个原因。首先,访问实例上的字段比访问静态、ThreadStatic或TLS数据(Thread.GetData/SetData)快。在ThreadLocal<T>内部的单个操作可能需要采用对后台数据源的多个读/写的情况下,从持有者一次检索装箱值并且随后读/写其T字段、而不是迫使所有的读/写操作直接针对HolderBase进行是更高效的。其次,由于在一个实施例中所执行的GenericHolder<U,V,W>实例的集中/重用,ThreadLocal<T>的两个不同实例将最终在应用程序的生存期使用相同的U、V、W参数集是可能的。如果发生这一情况,并且如果相同的线程最终访问两者,则线程将最终看到两者的相同的ThreadStatic状态,因为它是相同的底层GenericHolder<U,V,W>类型。由此,装箱实例还维护到当前与其相关联的ThreadLocal<T>的引用。在一个实施例中,当代码访问装箱实例的T值时,它还检查以查看装箱是否包含最新的ThreadLocal<T>实例引用。如果不包含最新引用,这意味着装箱实例是陈旧的,并且在一个实施例中被作为未初始化的来对待,而不是重用找到的现有的值。根据一个实施例,装箱类的示例在以下伪码示例VIII中给出:
伪码示例VIII
一个实施例提供了对初始化存储在ThreadLocal<T>实例中的数据的内置初始化支持。考虑在以下伪码示例IX中给出的代码:
伪码示例IX
[ThreadStatic]
static string s_myValue=ComputeValue();
示例IX中的代码创建了线程静态变量s_myValue,这意味着每个线程将得到存储字符串的其自己的s_myValue副本。另外,s_myValue被初始化为运行ComputeValue(计算值)方法的结果。然而,这在C#中工作的方式是编译器生成代码使得ComputeValue仅被求值一次,这意味着其求值和存储到s_myValue仅为一个线程而发生,并不是为系统中的任何其他线程发生。这使得难以初始化s_myValue。诸如以下伪码示例X中给出的代码可以在对s_myValue的每次访问之前被执行,以便确保它已经被正确地初始化:
伪码示例X
if(s_myValue==null)s_myValue=ComputeValue();
一个实施例通过允许开发者向ThreadLocal<T>提供在每个线程上被调用以便初始化该值的委托(即,表示函数的对象)来解决此初始化问题。一示例在以下伪码示例XI中给出:
伪码示例XI
static ThreadLocal<string>s_myValue=newThreadLocal<string>(ComputeValue);
示例XI中的代码创建了ThreadLocal<string>实例,它确保访问s_myValue.Value的每个线程都将使它首先被初始化为运行ComputeValue的结果。
图6是根据一个实施例的生成用于存储按线程、按实例的数据的持有者的方法600的流程图。在方法600中的602,生成ThreadLocal<T>并将其分配给变量“t”。在604,确定是否存在可用的先前使用的通用索引。如果在604确定了存在可用的先前使用的通用索引,则在606保留下一未使用的索引。在608,将先前使用的通用索引转换成通用类型集合(U、V、W...),并且生成GenericHolder<U,V,W>的实例。在618,将GenericHolder<U,V,W>实例存储到t.m_holder。
如果在604确定不存在可用的先前使用的通用索引,则该方法600移至610,在那里确定从按T的整数中是否可获得未使用的索引。如果在610确定未使用的索引可用,则接着在612确定是否达到最大全局(即,非按T的)通用实例化阈值。如果在612确定未达到最大全局阈值,则该方法600移至614,在那里从按T的整数中分配新索引并且更新全局通用实例化计数,并且该方法600随后移至608(如上所述)。
如果在610确定未使用的索引不可用,或如果在612确定已经达到最大全局阈值,则该方法600移至616。在616,该方法600退回到慢路径以使用TLSHolder来提供按线程、按实例的存储,并且该方法600随后移至618(如上所述)。
尽管此处说明并描述了具体实施例,但本领域技术人员可以理解,可用各种替换和/或等价实现来替换此处示出并描述的具体实施例而不背离本发明的范围。本申请旨在覆盖此处讨论的具体实施例的任何改编或变型。因此,本发明旨在仅由权利要求书及其等效方案来限制。
Claims (20)
1.一种存储按线程、按实例的数据的方法,包括:
标识对应于第一实例的独特索引值;
基于所标识的索引值来标识类型参数;
基于所标识的类型参数来实例化通用持有者对象,所述通用持有者对象包括被配置成存储对于所述第一实例是本地的按线程的数据的线程本地字段;以及
其中所述标识独特索引值、标识类型参数、以及实例化通用持有者对象由至少一个处理器来执行。
2.如权利要求1所述的方法,其特征在于,所述线程本地字段通过将线程静态属性应用于静态变量来创建。
3.如权利要求1所述的方法,其特征在于,所标识的类型参数对于所述第一实例是独特的,并且不被其他实例同时共享。
4.如权利要求1所述的方法,其特征在于,还包括:
实例化包括引用所述通用持有者对象的第一字段以及存储所述索引值的第二字段的线程本地对象。
5.如权利要求1所述的方法,其特征在于,还包括:
创建哑类型数组;以及
其中,所标识的类型参数取自所述哑类型数组。
6.如权利要求1所述的方法,其特征在于,还包括:
提供用于存储索引值的静态变量;以及
每次生成新实例时更新所述静态变量。
7.如权利要求6所述的方法,其特征在于,还包括:
标识先前使用但不再使用的索引值;以及
将所标识的先前使用的索引值存储在数据结构中。
8.如权利要求7所述的方法,其特征在于,所述标识独特索引值包括:
如果所述数据结构当前正存储至少一个索引值,则从所述数据结构中选择所述独特索引值;以及
如果所述数据结构当前没有正存储至少一个索引值,则基于所述静态变量选择所述独特索引值。
9.如权利要求1所述的方法,其特征在于,还包括:
为多个实例中的每一个重复所述标识独特索引值、标识类型参数、以及实例化通用持有者对象。
10.如权利要求9所述的方法,其特征在于,还包括:
确定所述多个实例中的实例总数是否超出预定阈值;以及
当所述实例总数超出预定阈值时,将数据槽分配给线程来用于存储按线程、按实例的数据。
11.如权利要求1所述的方法,其特征在于,所述独特索引值是以10为基数的数字,并且所述方法还包括:
将所述以10为基数的数字转换成具有不同基数的数字;以及
其中,所述类型参数是基于所述具有不同基数的数字来标识的。
12.一种存储计算机可执行指令的计算机可读存储介质,所述指令在由至少一个处理器执行时使得所述至少一个处理器执行一种存储按线程、按实例的数据的方法,所述方法包括:
标识对应于第一实例的独特索引值;
基于所标识的索引值来标识类型参数;以及
基于所标识的类型参数来实例化通用持有者对象,所述通用持有者对象包括被配置成存储对于所述第一实例是本地的按线程的数据的线程本地字段。
13.如权利要求12所述的计算机可读介质,其特征在于,所述线程本地字段通过将线程静态属性应用于静态变量来创建。
14.如权利要求12所述的计算机可读介质,其特征在于,所标识的类型参数对于所述第一实例是独特的,并且不被其他实例同时共享。
15.如权利要求12所述的计算机可读介质,其特征在于,所述方法还包括:
实例化包括引用所述通用持有者对象的第一字段以及存储所述索引值的第二字段的线程本地对象。
16.如权利要求12所述的计算机可读介质,其特征在于,所述方法还包括:
创建哑类型数组;以及
其中,所标识的类型参数取自所述哑类型数组。
17.如权利要求12所述的计算机可读介质,其特征在于,所述方法还包括:
提供用于存储索引值的静态变量;以及
每次生成新实例时更新所述静态变量。
18.如权利要求17所述的计算机可读介质,其特征在于,所述方法还包括:
标识先前使用但不再使用的索引值;以及
将所标识的先前使用的索引值存储在数据结构中。
19.如权利要求18所述的计算机可读介质,其特征在于,所述标识独特索引值包括:
如果所述数据结构当前正存储至少一个索引值,则从所述数据结构中选择所述独特索引值;以及
如果所述数据结构当前没有正存储至少一个索引值,则基于所述静态变量选择所述独特索引值。
20.一种存储按线程、按实例的数据的方法,包括:
实例化线程本地对象,由此生成第一实例;
标识对应于所述第一实例的独特索引值;
基于所标识的索引值来标识类型参数;
基于所标识的类型参数来实例化通用持有者对象,所述通用持有者对象包括被配置成存储对于所述第一实例是本地的按线程的数据的线程本地字段;以及
其中所述实例化线程本地对象、标识独特索引值、标识类型参数、以及实例化通用持有者对象由至少一个处理器来执行。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/691,378 | 2010-01-21 | ||
US12/691,378 US8326886B2 (en) | 2010-01-21 | 2010-01-21 | Per-thread, per-instance data storage |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102156630A true CN102156630A (zh) | 2011-08-17 |
CN102156630B CN102156630B (zh) | 2015-04-01 |
Family
ID=44278315
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110027146.1A Active CN102156630B (zh) | 2010-01-21 | 2011-01-20 | 按线程按实例的数据存储 |
Country Status (2)
Country | Link |
---|---|
US (1) | US8326886B2 (zh) |
CN (1) | CN102156630B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2017128952A1 (zh) * | 2016-01-28 | 2017-08-03 | 中兴通讯股份有限公司 | 堆栈的保护方法及装置 |
CN107741883A (zh) * | 2017-09-29 | 2018-02-27 | 武汉斗鱼网络科技有限公司 | 一种避免线程阻塞的方法、装置及计算机设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5812852A (en) * | 1996-11-14 | 1998-09-22 | Kuck & Associates, Inc. | Software implemented method for thread-privatizing user-specified global storage objects in parallel computer programs via program transformation |
US6557023B1 (en) * | 1999-05-28 | 2003-04-29 | Sun Microsystems, Inc. | Method and apparatus for avoiding array class creation in virtual machines |
US6915408B2 (en) * | 2002-05-22 | 2005-07-05 | International Business Machines Corporation | Implementation of thread-static data in multi-threaded computer systems |
US6985976B1 (en) * | 2002-02-22 | 2006-01-10 | Teja Technologies, Inc. | System, method, and computer program product for memory management for defining class lists and node lists for allocation and deallocation of memory blocks |
US20060031810A1 (en) * | 2004-08-09 | 2006-02-09 | Jinzhan Peng | Method and apparatus for referencing thread local variables with stack address mapping |
CN1816802A (zh) * | 2003-07-01 | 2006-08-09 | 斯图加特大学 | 用于准确的指针识别的处理器体系结构 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH05204656A (ja) | 1991-11-30 | 1993-08-13 | Toshiba Corp | スレッド固有データ保持方法 |
US6115802A (en) * | 1995-10-13 | 2000-09-05 | Sun Mircrosystems, Inc. | Efficient hash table for use in multi-threaded environments |
JPH1049381A (ja) * | 1996-07-04 | 1998-02-20 | Internatl Business Mach Corp <Ibm> | 複数のデータ処理要求の処理方法及び処理システム、プログラムの実行方法及びシステム |
US6330709B1 (en) | 1998-03-30 | 2001-12-11 | International Business Machines Corporation | Virtual machine implementation for shared persistent objects |
GB2345160B (en) | 1998-12-23 | 2003-08-20 | Ibm | Virtual machine memory management |
US6539464B1 (en) * | 2000-04-08 | 2003-03-25 | Radoslav Nenkov Getov | Memory allocator for multithread environment |
-
2010
- 2010-01-21 US US12/691,378 patent/US8326886B2/en active Active
-
2011
- 2011-01-20 CN CN201110027146.1A patent/CN102156630B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5812852A (en) * | 1996-11-14 | 1998-09-22 | Kuck & Associates, Inc. | Software implemented method for thread-privatizing user-specified global storage objects in parallel computer programs via program transformation |
US6557023B1 (en) * | 1999-05-28 | 2003-04-29 | Sun Microsystems, Inc. | Method and apparatus for avoiding array class creation in virtual machines |
US6985976B1 (en) * | 2002-02-22 | 2006-01-10 | Teja Technologies, Inc. | System, method, and computer program product for memory management for defining class lists and node lists for allocation and deallocation of memory blocks |
US6915408B2 (en) * | 2002-05-22 | 2005-07-05 | International Business Machines Corporation | Implementation of thread-static data in multi-threaded computer systems |
CN1816802A (zh) * | 2003-07-01 | 2006-08-09 | 斯图加特大学 | 用于准确的指针识别的处理器体系结构 |
US20060031810A1 (en) * | 2004-08-09 | 2006-02-09 | Jinzhan Peng | Method and apparatus for referencing thread local variables with stack address mapping |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2017128952A1 (zh) * | 2016-01-28 | 2017-08-03 | 中兴通讯股份有限公司 | 堆栈的保护方法及装置 |
CN107741883A (zh) * | 2017-09-29 | 2018-02-27 | 武汉斗鱼网络科技有限公司 | 一种避免线程阻塞的方法、装置及计算机设备 |
WO2019061619A1 (zh) * | 2017-09-29 | 2019-04-04 | 武汉斗鱼网络科技有限公司 | 一种避免线程阻塞的方法、装置及计算机设备 |
Also Published As
Publication number | Publication date |
---|---|
US8326886B2 (en) | 2012-12-04 |
CN102156630B (zh) | 2015-04-01 |
US20110179038A1 (en) | 2011-07-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Anzt et al. | Ginkgo: A modern linear operator algebra framework for high performance computing | |
Buss et al. | STAPL: Standard template adaptive parallel library | |
Würthinger et al. | Self-optimizing AST interpreters | |
KR101900796B1 (ko) | 기민 통신 오퍼레이터 | |
Beckingsale et al. | Umpire: Application-focused management and coordination of complex hierarchical memory | |
CN105493040A (zh) | 在访问动态类型化阵列对象过程中的尺寸依赖类型 | |
Sandrieser et al. | Using explicit platform descriptions to support programming of heterogeneous many-core systems | |
CN101681294A (zh) | 存储器事务分组 | |
JP6432450B2 (ja) | 並列計算装置、コンパイル装置、並列処理方法、コンパイル方法、並列処理プログラムおよびコンパイルプログラム | |
EP2656203A2 (en) | Extensible data parallel semantics | |
CN103782276A (zh) | 从原始虚拟机到目的地虚拟机的操作转移 | |
Redondo et al. | Efficient support of dynamic inheritance for class-and prototype-based languages | |
Bourgoin et al. | SPOC: GPGPU programming through stream processing with OCaml | |
Gruber et al. | LLAMA: The low‐level abstraction for memory access | |
Jones et al. | Unity: unified memory and file space | |
Welch et al. | Extending the OpenSHMEM memory model to support user-defined spaces | |
CN102156630B (zh) | 按线程按实例的数据存储 | |
Grove et al. | Supporting array programming in X10 | |
Maskit et al. | A message‐driven programming system for fine‐grain multicomputers | |
Choi et al. | Implementing cuda unified memory in the pytorch framework | |
Matz et al. | Automated partitioning of data-parallel kernels using polyhedral compilation | |
Hu et al. | EVMTracer: Dynamic Analysis of the Parallelization and Redundancy Potential in the Ethereum Virtual Machine | |
Zhang et al. | Evaluating the performance and scalability of mapreduce applications on x10 | |
Pancake et al. | High-performance Java | |
Zhang et al. | Versionized process based on non-volatile random-access memory for fine-grained fault tolerance |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | 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 | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150728 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20150728 Address after: Washington State Patentee after: Micro soft technique license Co., Ltd Address before: Washington State Patentee before: Microsoft Corp. |