CN102047222A - 用于线程安全数据集合的阻塞和绑定包装器 - Google Patents

用于线程安全数据集合的阻塞和绑定包装器 Download PDF

Info

Publication number
CN102047222A
CN102047222A CN2009801212067A CN200980121206A CN102047222A CN 102047222 A CN102047222 A CN 102047222A CN 2009801212067 A CN2009801212067 A CN 2009801212067A CN 200980121206 A CN200980121206 A CN 200980121206A CN 102047222 A CN102047222 A CN 102047222A
Authority
CN
China
Prior art keywords
data acquisition
data
thread
membership qualification
data element
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
Application number
CN2009801212067A
Other languages
English (en)
Other versions
CN102047222B (zh
Inventor
S·托布
J·达菲
S·埃尔巴加迪
E·阿里
I·奥斯特罗夫斯基
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of CN102047222A publication Critical patent/CN102047222A/zh
Application granted granted Critical
Publication of CN102047222B publication Critical patent/CN102047222B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/526Mutual exclusion algorithms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/604Tools and structures for managing or administering access control systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/62Protecting access to data via a platform, e.g. using keys or access control rules
    • G06F21/6218Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Health & Medical Sciences (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • Bioethics (AREA)
  • Health & Medical Sciences (AREA)
  • Databases & Information Systems (AREA)
  • Automation & Control Theory (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Devices For Executing Special Programs (AREA)
  • Machine Translation (AREA)
  • User Interface Of Digital Computer (AREA)

Abstract

成员资格接口提供过程标题以便在不指定数据集合的组织结构的情况下添加和移除数据集合的元素。与成员资格接口相关联的成员资格实现提供线程安全操作以实现接口过程。成员资格实现上的阻塞-绑定包装器与线程安全机制分开提供阻塞和绑定支持。

Description

用于线程安全数据集合的阻塞和绑定包装器
背景
已经以各种配置设计多线程环境。执行线程可以并行运行,或线程可以被组织成并行执行但实际上按顺序轮流执行。可以例如通过在多处理环境中在不同的核心上运行不同的线程、通过对单个处理器核心上的不同线程进行时间分片、或通过时间分片和多处理器线程的某种组合来实现多线程。可以例如通过内核的线程调度器、通过用户-空间信号、或通过用户-空间和内核操作的组合来启动线程上下文切换。
多处理器环境出现在各种配置中。在一种给定配置中,所有处理器可以在功能上相同,然而在另一配置中,一些处理器可能由于具有不同的硬件能力、不同的软件指派或两者而不同于其他处理器。取决于配置,处理器可以在单个总线上彼此紧密地耦合,或它们可以松耦合。在一些配置中,处理器共享中央存储器,在一些配置中,它们各自具有其自己的本地存储器,并且在一些配置中,存在共享存储器和本地存储器两者。
概述
在一些实施例中,成员资格接口支持改变数据集合中的数据元素的数量的操作。成员资格实现与成员资格接口相关联。数据集合具有在成员资格接口中未指定但是在成员资格实现中是专用的组织结构。成员资格实现上的阻塞-绑定包装器响应于成员资格接口的调用而执行阻塞-绑定操作。例如,在一些实施例中,当数据集合缺少可供移除的数据元素时,阻塞操作在尝试从数据集合中移除数据元素期间挂起执行。类似地,在一些实施例中,当缺少添加数据元素所需要的存储器空间或另一资源时,绑定操作在尝试将数据元素添加到数据集合期间挂起执行。
在一些实施例中,阻塞-绑定包装器为支持最小接口的任何数据集合,例如提供添加元素过程和移除元素过程的数据集合提供阻塞和绑定支持。具体地,一些实施例支持对添加或移除数据元素的线程安全操作的阻塞和绑定。在一些实施例中,组合阻塞-绑定语义和线程安全操作,同时管理多个异类数据集合。
给定示例仅仅是说明性的。本发明内容并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。相反,提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本发明用权利要求来限定,并且如果本概述与权利要求冲突,则应以权利要求为准。
附图说明
将参考附图来给出更具体的描述。这些图仅示出所选择的方面且因而并不完全地确定有效范围或范围。
图1是示出操作环境中的多线程计算机***和经配置的存储介质实施例的框图;
图2是进一步示出配置有成员资格接口、成员资格实现、阻塞-绑定包装器和至少一个数据集合的多线程计算机***的框图;
图3是示出包括使用数据集合、成员资格接口、成员资格实现、阻塞-绑定包装器和多个数据集合的软件的配置的框图;
图4是进一步示出成员资格接口的框图;
图5是进一步示出成员资格实现的框图;
图6是进一步示出阻塞-绑定包装器、单独的线程安全机制和数据集合的框图;
图7是示出包括成员资格接口、成员资格实现、阻塞-绑定包装器和多个数据集合的配置的框图,这些数据集合是异类的,因为它们共同地具有多个组织结构;
图8是示出将成员资格实现包装在数据流水线中的阻塞-绑定的框图;
图9是示出一些方法的步骤和经配置的存储介质实施例的流程图;以及
图10是使用具体的C-Sharp程序示例来进一步示出一些方法的步骤和经配置的存储介质实施例的流程图。
详细描述
概览
阻塞语义已经依赖于特定的数据结构,例如在阻塞队列的情况下的队列,或在阻塞栈的情况下的栈。阻塞队列在文献中被讨论并且出现在广泛使用的框架中。在出列操作的执行期间,阻塞队列支持等待队列变成非空的。在入列操作(也称为绑定)的执行期间,一些阻塞队列可选地支持等待队列变成非满。存在类型变体,例如,诸如实现阻塞和绑定栈的具体类型,或阻塞和绑定集。阻塞和绑定数据结构实现同步访问以便防止多个线程同时修改数据结构是不寻常的,尽管可以以相当大的性能代价来实现同步。
如果阻塞和绑定语义可以被应用到其实现被外部地提供的任意集合,则它们可以是更一般地有用的。例如,可以实现优先级队列而不考虑绑定和阻塞,且然后将绑定和阻塞行为应用到该优先级队列,以便在需要阻塞和绑定语义的情况下使用优先级队列。对于其他数据集合组织结构,相似的使用可以出现在具有阻塞-绑定的经排序的列表、具有阻塞-绑定的未经排序的包等。
在此讨论的一些实施例以对于实际上用于数据集合的数据结构的类型或实现不可知的方式在线程安全数据集合上提供阻塞和绑定语义。所定义的成员资格接口标识修改数据集合的方式,且接口的具体实现实现相关的方法。所支持的数据结构不需要在先知道实现阻塞-绑定语义的类型,这是因为数据集合仅仅需要实现至少提供线程安全添加和移除操作的最小接口。此外,实施例仅仅需要显式地同步对表示底层数据集合中的可用数据元素的数量的计数信号量的访问,且并不需要同步对数据集合本身的访问。数据集合实现在内部提供线程安全性语义且通过接口屏蔽,且其可以以对于相关数据结构而言尽可能高效的方式来这样做。例如,在栈的情况下,可以利用用于无锁栈实现的公知算法。非线程安全集合还可以被包装在实现成员资格接口的线程安全包装器中。
现在将参考诸如附图中示出的示例性实施例,且在此将使用专用语言来描述这些示例性实施例。但是,相关领域的技术人员和拥有本发明的人应想到的、对在此所示出的特征的更改和进一步的修改以及对在此示出的原理的其他应用应被认为是在权利要求的范围内。
在本发明中阐述术语的含义,所以应仔细关注这些阐述来阅读权利要求。给出具体示例,但是相关领域的技术人员将理解,其他示例也可以落在所使用的术语的含义内且落在一个或多个权利要求的范围内。术语在这里并不一定具有它们在一般的用法中、在特定的行业的用法中或在特定字典或字典集中具有的相同含义。附图标记可以与各种措辞一起使用,以帮助示出术语的广度。从给定文本段中忽略参考数字并不一定意味着图的内容没有被该文本讨论。发明人断言他们的权利并将其运用至他们自己的词典学。在此,在详细描述中和/或在申请文件中的其他地方,术语可以被显式或隐式定义。
在此所使用的“计算机***”可以包括,例如一个或多个服务器、主板、处理节点、个人计算机(便携式或非便携式)、个人数字助理、蜂窝或移动电话和/或提供至少部分地通过指令控制的一个或多个处理器的设备。指令可以具有存储器和/或专用电路中的软件的形式。具体地,尽管可以出现许多实施例在服务器计算机上运行的情况,但是其他实施例可以在其他计算设备上运行,且任何一个或多个这样的设备可以是给定实施例的一部分。
“多线程计算机***”是支持多个执行线程的计算机***。线程可以并行、串行运行或以并行执行(例如,多处理)和串行执行(例如,时间分片)的组合运行。
“逻辑处理器”或“处理器”是单个独立硬件线程。例如,每一核心运行两个线程的超线程四核芯片具有八个逻辑处理器。处理器可以是通用的,或它们可以被定制为专用的,例如图形处理、信号处理、浮点算术处理、加密、I/O处理等。
在此所使用的涉及数据结构的术语仅仅如它们的表达限定词那样具体。例如,在没有进一步限定的情况下,术语“列表”包括链接列表和使用数组实现的列表两者。
只要参考数据集合或其他数据结构,应理解,与简单地存在于纸上相反,数据结构在程序员的头脑中或例如作为导线上的瞬时信号配置计算机可读存储器。
操作环境
参考图1,用于一实施例的操作环境100可以包括,例如多线程计算机***102。尽管多线程计算机***在此被呈现为示例,但是也可以使用不是多线程的计算机***来提供实施例。同样地,一些实施例被配置为多处理,而其他实施例未被配置为多处理。人类用户104可以通过使用屏幕、键盘和其他***设备106与多线程计算机***102或与一实施例中的另一计算机***交互。在一些实施例中,存储设备和/或联网设备可以被认为是***装备。本身可以是或不是多线程或多处理的其他计算机***(未示出),可以经由例如网络接口装备使用一个或多个网络连接来与多线程计算机***102或与另一***实施例交互。
多线程计算机***102包括执行一个或多个线程120的至少一个逻辑处理器110。其他计算机***实施例还将含有至少一个处理器,但是将不一定含有线程。多线程计算机***102如同其他合适的***一样,还包括一个或多个存储器112。存储器112可以是易失性的、非易失性的、固定的、可移动的、磁性的、光学的和/或是其他类型。具体地,当被***或以其他方式安装时,经配置的介质114,诸如CD、DVD、记忆棒或其他可移动非易失性存储器介质可以在功能上变成多线程计算机***102的一部分,使得其内容可访问以供处理器110使用。经配置的可移动介质114是存储器112的示例。存储器112的其他示例包括内置RAM、ROM、硬盘和用户104不容易移动的其他存储设备。
介质114配置有可由处理器110执行的指令116。介质114还配置有通过执行指令116来创建、修改、引用和/或以其他方式使用的数据118。数据118可以包括数据结构,某些数据结构可以被组织在具有特定组织结构128的数据集合126中。指令116和数据118配置它们驻留在其中的存储器112/介质114;当该存储器是给定计算机***的功能部分时,指令116和数据118还配置该计算机***。为了说明清楚,存储器112在图1中以单个框来示出,但是应理解,存储器可以具有不同的物理类型,且在附图中示出的线程120、数据118、软件和其他项目可以部分地或完全驻留在一个或多个存储器112中,由此配置那些存储器。
在给定操作环境中,多线程计算机***102或另一计算机***可以运行一个或多个应用程序122,可以运行操作***124,且可以使用现在已知或在下文中形成的任何网络接口装备。具体地,应用程序122可以是嵌入式的。可以存在诸如存储器分配和无用信息收集例程、句柄管理器等资源管理器130。上面未明确命名的其他软件和/或硬件132也可以存在于给定配置中。
操作环境可以包括一个或多个多线程计算机***或非多线程计算机***。这些计算机***可以群集、客户机—服务器联网和/或对等联网。一些操作环境包括独立(非联网的)计算机***。
用于一些实施例的合适的操作环境中的某一些包括Microsoft.NETTM环境(微软公司的商标)。一些合适的操作环境包括Java
Figure BPA00001269867600052
环境(Sun微***有限公司的商标),且一些合适的操作环境包括利用例如C++或C#(“C-Sharp”)等语言的环境。
***
现在参考图1到图8,一些实施例包括配置有成员资格接口202、成员资格实现204和阻塞-绑定包装器206的计算机***。这些组件中的每一个在下面更详细地讨论。
一些实施例包括经配置的计算机可读存储介质114,其是存储器112的示例。存储器112可以包括盘(磁盘、光盘或其他)、RAM、EEPROM或其他ROM和/或其他可配置存储器。可以是可移动的或不可移动的且可以是易失性或非易失性的通用存储器112可以被配置成使用从可移动介质114和/或诸如网络连接等另一源读取的对应数据118和指令116的形式的组件,诸如成员资格接口202、成员资格实现204和阻塞-绑定包装器206的实施例,以便由此形成经配置的存储器112的形式的经配置的介质,该经配置的介质能够使计算机***以在此公开的类型不可知方式执行阻塞-绑定包装器放置和/或利用步骤并提供阻塞-绑定语义。图1到图8因而有助于示出经配置的存储介质实施例和方法实施例以及***实施例。
在一些实施例中,将存在与一个或多个处理器110和存储器112在操作上通信的***装备,诸如人类用户I/O设备(屏幕、键盘、鼠标、话筒、扬声器、运动传感器等)。然而,实施例还可以被深度嵌入在***中,以使得人类用户104不能直接与该实施例交互。
在一些实施例中,例如,计算机***中将存在使用诸如分组交换网络接口卡、无线收发器或电话网络接口的组件来提供对网络108的接入的联网接口装备。然而,一实施例还可以通过直接存储器存取、可移动非易失性介质或其他信息存储-检索和/或传输方法来进行通信,或计算机***中的实施例可以在不与其他计算机***通信的情况下操作。
如图2所示,多线程计算机***102可以配置有成员资格接口202、成员资格实现204和阻塞-绑定包装器206。线程120也存在于所示配置中,线程120的执行至少部分地通过线程调度器208来调度。线程120可以使用成员资格实现中的例程来尝试访问给定数据集合126的各个数据元素210。线程安全机制212存在于例如成员资格实现204中,用以帮助防止由于使得两个线程同时访问数据集合而引起的不一致性。合适的线程安全机制可以包括例如实现互斥和/或原子操作的锁。访问尝试可以向数据集合126添加数据元素210、从数据集合126移除数据元素210、挂起线程120的执行和/或失败。由访问尝试返回的结果214可以包括数据元素210、状态码或两者。
参考图3到图8,一实施例不一定需要多线程计算机***102。一些实施例使用不是多线程的计算机***。一些实施例包括单个逻辑处理器110,且一些实施例包括多个逻辑处理器。一些实施例是多线程的并被配置为允许至少两个线程在不同的逻辑处理器上执行。一些实施例在单个处理器上多线程运行。当然,给定实施例中需要的组件由权利要求控制,而不是由附图控制。
如图3所示,一些实施例包括多个数据集合126,或至少提供对多个数据集合126的访问。在一些实施例中,所有数据集合126具有相同的数据元素210类型;在其他实施例中,存在不同类型的数据元素210。在一些实施例中,所有的数据集合126具有相同的组织结构128,例如,它们全部被组织为栈,或它们全部被组织为FIFO队列。在其他实施例中,存在至少两个不同的组织结构128。具体地,且并不限制前述内容,一些实施例包括多个数据集合126,或至少提供对多个数据集合126的访问,这些数据集合126具有相同的底层数据元素210类型但是具有不同的组织结构128。例如,一实施例可以提供对一个数据集合中的game_event元素栈和另一数据集合中的game_event元素包的统一访问。
如还由图3所示,尝试访问数据元素210的软件可以具有不同种类。一实施例的各方面可以用于例如向应用程序122、操作***124或其他软件提供阻塞-绑定数据元素访问。具体地,一实施例的各方面可以用于为运行多个线程的软件提供用于对数据集合的线程安全操作的阻塞-绑定访问语义。
如图4所示,成员资格接口的一些实施例包括一个或多个“过程标题”。过程标题可以被实现为方法签名、类型签名、过程说明、方法声明等等。过程标题提供诸如函数或其他软件例程的名称、例程所期望的参数和值(如果例程返回的话)等信息。
图4示出用于成员资格接口202的可能的过程标题400中的三个。添加过程标题402将接口定义为尝试向数据集合126添加数据元素210的一个或多个例程。移除过程标题404将接口定义为尝试从数据集合126中移除数据元素210的一个或多个例程。查找并移除过程标题406将接口定义为尝试查找满足一个或多个指定准则的数据元素210且然后从数据集合126中移除该数据元素的一个或多个例程。给定成员资格接口202可以包括一个或多个这样的过程标题。
成员资格接口202的一些实施例包括超时接口408。超时接口408可以包括过程标题400和/或诸如变量等其他项目。如果使用通过过程标题400调用的例程来修改数据集合成员资格的尝试比由超时接口408指定的超时值花费更长的时间,则该修改尝试被中断。数据集合内容和用于扼流该内容的信号量保持不变。可以返回指示超时发生的结果214。在一些实施例中,对于不同的过程标题400,可以指定不同的超时值(包括没有超时值)。
成员资格接口202的一些实施例包括完成接口410。完成接口410可以包括过程标题400和/或其他项目,例如标志变量。使用完成接口410,给定数据集合126或一组给定数据集合126可以被标记为已完成。在一些实施例中,完成接口允许数据集合被标记为永久为空,这指示将不向已完成的数据集合126添加新的数据元素210,例如,将永不为该数据集合再次调用添加过程标题402。结果,等待将不再出现的数据元素210的任何剩余的移除操作可以被唤醒;数据集合126是空的且将不再接收数据元素。同样地,可阻止任何将来的移除操作等待将不再出现的数据元素。在一些实施例中,完成接口允许数据集合被标记为永久为满,这指示将不从已完成的数据集合126中移除新的数据元素210,例如,将不再为该数据集合调用移除过程标题404和/或查找并移除过程标题406。结果,等待将不再出现的可用空间的任何剩余的添加操作可以被唤醒;数据集合126是满的。同样地,可以阻止任何将来的添加操作等待。
图5示出成员资格实现204的可能的过程体500中的某一些,其实现在成员资格接口202中所呈现的操作。给定成员资格接口202可以具有不止一个对应的成员资格实现204,这是因为数据集合126的组织结构128在成员资格接口202中未被指定,但在成员资格实现204的例程中是专用的。添加过程体502实现尝试向数据集合126添加数据元素210的例程。移除过程体504实现尝试从数据集合126中移除数据元素210的例程。查找并移除过程体506实现尝试查找满足一个或多个指定准则的数据元素210且然后从数据集合126中移除该数据元素的例程。超时实现508同样实现超时接口408,且完成实现510同样实现完成接口410。
图6示出阻塞-绑定包装器206,其在一些实施例中包括可执行代码602和信号量604、信号量606以提供阻塞-绑定语义。给定实施例可以提供阻塞语义、绑定语义或两者。作为对这些信号量的替换或补充,给定实施例可以使用诸如条件变量等不同的扼流机制来提供阻塞-绑定语义。访问数据元素210的尝试可以通过与线程安全机制212结合的阻塞-绑定包装器206来管理,如图6所示。锁608或其他线程安全机制212不是阻塞-绑定包装器206的一部分,但是(如果存在的话)将被内置于成员资格实现204中。包装器206依赖于由成员资格实现提供的线程安全性并因此不需要锁608。
非线程安全集合126可以被包装在实现正确的接口的单个线程安全包装器中,例如:
    class NonThreadSafeStack
{
    public void Push(T item) {…}
    public T Pop() {…}
}
    class ThreadSafeStack:IConcurrentCollection
    {
    private NonThreadSafeStack_stack;
    public ThreadSafeStack(
    NonThreadSafeStack stack){
    _stack=stack;
    }
    public bool TryAdd(T item){
    lock(_stack)_stack.Push(item);
    return true;
    }
    public bool TryRemove(out T item){
    lock(_stack)item=_stack.Pop();
    return true;
    }
    …
    }
给定NonThreadSafeStack(非线程安全栈),仍然可以将其与BlockingCollection<T>一起使用,例如:
private BlockingCollection<T> bc=
  new BlockingCollection<T>(
  new ThreadSafeStack(
  new NonThreadSafeStack()));
//等等。
开发者可以用线程安全集合来包装非线程安全集合,以便允许使用阻塞-绑定包装器206。如果其中使用此包装器的通用框架(例如,Microsoft.NET框架或Java框架)提供表示相关添加/移除操作的非线程安全版本的接口,则阻塞-绑定包装器本身可以被实现为用线程安全集合来包装提供给它的非线程安全集合,在该情况下,包装器将内部地使用其自己的锁来提供线程安全性。
至少对于线程而言,诸如信号量604或信号量606等信号量类似于临界区,不同之处在于信号量在任一时刻在该区域允许最多N个线程,而不是在任一时刻只允许一个线程进入该区域。N可以是一,在该情况下,信号量可以用于互斥,但是信号量并不一定需要被用于互斥。
信号量可以在阻塞队列实现中例如用来扼流可以从数据集合移除的数据元素的数量,支持对移除的阻塞。每一次向集合添加元素时,信号量的计数增加。每一次移除元素时,信号量的计数减少。如果曾经尝试减少信号量的计数,且计数已经是零,则操作将阻塞直到信号量的计数使得元素能够被移除,例如直到另一线程出现并增加计数。一种实现可以是这样:
public void Add(T data)
{
lock(_queue)_queue.Enqueue(data);
_semaphore.Release();
}
public T Remove()
{
_semaphore.WaitOne();
lock(_queue)return_queue.Dequeue();
}
在前述的示例中,信号量用于扼流移除,且锁用于确保多个线程不同时尝试修改(非线程安全)底层集合(queue)。一些实施例允许改为使用任意的线程安全集合,这避免了内部锁,但仍然使用信号量来扼流。
如图6所示,阻塞-绑定包装器206本身可以没有诸如锁608、临界区或互斥区等任何线程安全机制212。即,由阻塞-绑定包装器206提供的扼流能力不同于线程安全机制。实际上,如在此所描述的,阻塞-绑定包装器206可以被用于不是多线程并因此不需要线程安全性的计算机***。
如图7所示,给定成员资格接口202可以具有多个对应的成员资格实现204,对于其中的每一个,阻塞-绑定包装器206提供阻塞-绑定语义。同样地,可以存在具有多个相应的组织结构128的多个数据集合126。通过将那些多个实现置于单个合并实现中且然后用绑定-阻塞包装器来包装该合并实现,使得一个绑定-阻塞包装器206在多个成员资格实现204周围是可能的。另选地或另外地,实施例可以是每一个成员资格实现204具有一个绑定-阻塞包装器206。为了在多种情况下操作,在包装器的层面上而不是在实现的层面上对其进行操作。
如图8所示,连接802可以用于将数据流水线806中的过滤器804从数据源808连接到数据目的地810。每一个连接802包括包装在阻塞-绑定包装器206中的成员资格实现204。相同的底层数据集合126并不一定用于连接802中的每一个。例如,可以在两个过滤器之间使用阻塞栈,而在两个其他过滤器之间使用阻塞队列。由于连接802的成员资格接口202没有改变,因此过滤器804不需要关于在数据集合126中使用的实际数据结构的先验知识,且各自可以通过相同的成员资格接口202访问数据元素210。
一种实施例包括多线程计算机***102,其中至少一个存储器112配置有可执行指令116,且至少一个逻辑处理器110被配置成执行指令的至少一部分,以便执行改变数据集合126中的成员数据元素210的数量的线程安全和阻塞-绑定操作。成员资格接口202提供用于访问数据集合的公共线程安全容器接口。成员资格接口202配置存储器。成员资格接口202被设计成调用线程安全操作来改变数据集合126中的数据元素210的数量,数据集合126具有在成员资格接口202中未指定的组织结构128。
在此实施例中,配置存储器112的成员资格实现204与成员资格接口202相关联。成员资格实现204包括实现改变数据集合126中的数据元素210的数量的线程安全操作的指令116。数据集合126的组织结构128在成员资格实现中是专用的,例如,成员资格实现添加过程体502被定制成向栈添加数据元素。在一些实施例中,当调用构造函数时,成员资格实现204与成员资格接口202相关联。
阻塞-绑定包装器206也配置存储器112并包装成员资格实现204,即,通过添加阻塞-绑定语义来补充成员资格实现204。阻塞-绑定包装器206被配置成响应于成员资格接口202的过程标题400的调用而执行指令116以执行下列的阻塞-绑定操作中的至少一个:当数据集合缺乏可供移除的数据元素时对从数据集合126中移除数据元素210的尝试执行的阻塞操作;当缺乏向数据集合126添加数据元素210所需要的资源(例如,存储器112中足够的空闲空间)时对向数据集合126添加数据元素210的尝试执行的绑定操作。在一些实施例中,阻塞-绑定包装器206本身包括扼流信号量,诸如信号量604和/或信号量606,但是不包含线程安全性锁608或其他线程安全机制。
在一些实施例中,成员资格接口202包括用于调用线程安全数据集合添加操作的添加过程标题402,该线程安全数据集合添加操作即将接受数据元素210、尝试向数据集合126添加数据元素并返回指示添加尝试的结果214的状态的线程安全操作。在一些实施例中,成员资格接口202包括用于调用线程安全数据集合移除操作的移除过程标题404,该线程安全数据集合移除操作即将尝试从数据集合126移除数据元素210并至少返回诸如状态码和/或所移除的数据元素210等移除尝试的结果214的指示的线程安全操作。在一些实施例中,成员资格接口202包括用于调用线程安全数据集合查找并移除操作的查找并移除过程标题406,该线程安全数据集合查找并移除操作即将尝试在数据集合126中查找匹配至少一个指定数据元素准则(例如匹配键值或指定的值范围)的数据元素210,将尝试移除这样的数据元素(如果找到的话)并将至少返回查找并移除尝试的结果214的指示的线程安全操作。
在一些实施例中,成员资格接口202包括形成超时接口408的至少一部分的成员变更超时值。如果尝试改变数据集合的成员(例如,通过添加数据元素210)所花费的时间超过超时值,则阻塞-绑定操作超时并返回失败指示作为结果214。
在一些实施例中,成员资格接口202包括形成完成接口410的至少一部分的完成值。该***包括被设计成注意数据集合126永久为空的指令116和被设计成然后迅速地唤醒所有线程120并给予其失败指示的指令116,否则这些线程将在尝试从永久为空的数据集合126中移除数据元素210时仍然永久地被阻塞。
在一些实施例中,***包括配置存储器112的多个数据集合126。数据集合126可以共同地展示至少两个不同的组织结构128(例如,栈和队列),在这种情况下,可执行指令116可以包括在成员资格实现204和阻塞-绑定包装器206中的指令,这些指令被设计成使用线程安全绑定操作来尝试向数据集合126中的任一个添加数据元素210。一些相似的实施例包括指令116,指令116被设计成使用线程安全阻塞操作来尝试从数据集合126中的任一个中移除数据元素210。
并不是附图中示出的每一项都需要存在于每一个实施例中。尽管在此在文本和附图中通过具体的示例示出一些可能性,但是各实施例可以背离这些示例。例如,示例的具体特征可以被忽略、重命名、不同地分组、重复、不同地用硬件和/或软件来实例化,或者是两个或更多个示例中出现的特征的混合。
方法概览
图9在流程图900中示出了一些方法实施例。在一给定实施例中,方法的零个或更多个所示步骤可以被重复,也许具有要操作的不同参数或数据。实施例中的步骤还可以按与图中安排的自顶向下的次序不同的次序进行。各步骤可以串行、以部分重叠的方式或完全并行执行。其中遍历流程图900以指示在方法期间执行的步骤的次序可以随方法的执行而变化。流程图遍历次序还可以随方法实施例而变化。步骤还可以被忽略、组合、重命名、重分组或以其他方式背离所示流程,只要所执行的方法是可操作的并符合至少一项权利要求。
在成员资格接口获取步骤902期间,软件开发者(或代表开发者运作的代码)获取成员资格接口202。获取步骤902可通过包括包含实现成员资格接口202的代码的文件、通过链接这样的文件、通过加载这样的文件、或通过用于将软件功能引入环境或特定程序中的任何机制来完成。开发者被理解为特定类型的用户104;终端用户也被认为是用户104。
在过程标题获取步骤904期间,开发者或环境获取过程标题400。过程标题获取步骤904可以与接口获取步骤902一致,但是还应理解,通过获取902成员资格接口202,在一些情况下可由此获取904若干过程标题400。
在成员资格实现关联步骤906期间,将成员资格实现204与成员资格接口202相关联。关联步骤906可通过实例化类、通过链接、通过设置例程的地址指针或通过用于将过程体500与过程标题400相关联以使得对过程标题的调用向过程体传递控制(且常常还有参数)的任何其他机制来完成。
在过程体关联步骤908期间,将过程体500与过程标题400相关联。给定过程标题400可以与***中的不同的位置处的不同过程体500相关联908。过程体关联步骤908可以与实现关联步骤906一致,但是还应理解,通过关联906成员资格实现204,在一些情况下可由此关联908若干过程体500。
在包装步骤910期间,用阻塞-绑定包装器206来包装成员资格实现204。包装步骤910可通过实例化或用包装器206的阻塞或绑定例程将成员资格实现204过程体500放置在调用链中的任何机制来完成。
在成员资格接口过程调用步骤912期间,调用成员资格接口202中具有过程标题400的过程。调用步骤912可以使用向例程传递控制的机制来完成,且可以包括向例程传递参数。
在由调用步骤912引起的移除尝试步骤914期间,尝试从数据集合126中移除数据元素210。移除哪一元素取决于数据集合的实现和当前的内容。如果要移除特定元素,则执行查找并移除操作而不是移除操作。移除尝试步骤914返回被移除的元素(如果元素可以被移除),且可以返回状态码。尝试步骤914可以包括调用成员资格实现204过程体500,例如移除过程体504或查找并移除过程体506。从数据集合移除914并不一定阻塞;执行仅在元素不可供移除移除的情况下阻塞,且在元素可供移除之后继续。
在阻塞步骤916期间,阻塞操作由阻塞-绑定包装器206的代码602来执行。例如,如果没有可供从数据集合126移除的数据元素210,例如,因为数据集合126是空的,则阻塞操作挂起步骤914移除尝试例程的执行。
在可由调用步骤912引起的添加尝试步骤918期间,尝试向数据集合126添加数据元素210。尝试步骤914可以包括调用成员资格实现204过程体500,例如添加过程体502。添加918并不总是阻塞执行。执行阻塞直到集合中存在添加项目的空间;如果已经存在空间,则无需阻塞。在一些实施例中,与向每一个数据集合添加数据元素的副本相反,向与成员资格接口相关联的任意数量的集合中的一个添加单个数据元素。
在绑定步骤920期间,绑定操作由阻塞-绑定包装器206的代码602来执行。例如,如果在数据集合126中没有大到足以容纳数据元素210的存储器空间可用,则绑定操作挂起步骤918添加尝试例程的执行。
在可以由调用步骤912引起的查找并移除尝试步骤922期间,尝试在数据集合126中查找满意的数据元素210,并且如果找到满意的数据元素210就将其移除。零个、一个或多个数据元素210可以是满意的,这取决于搜索准则、存在的数据元素和所讨论的实施例的编码。尝试步骤922可以包括调用成员资格实现204过程体500,例如查找并移除过程体506。
在放置步骤924期间,使用脚本、流水线、I/O重定向和/或用于构建数据流水线的其他机制来将连接802放置在数据流水线806中。
在导出步骤926期间,使用在诸如C-Sharp或Java等编程语言中提供的、通过在此的教导告知以帮助提供阻塞-绑定语义和/或阻塞-绑定线程安全操作的机制,来导出数据集合类实例。
在构造函数定义步骤928期间,使用在诸如C-Sharp或Java等编程语言中提供的、通过在此的教导告知以帮助提供阻塞-绑定语义和/或阻塞-绑定线程安全操作的机制,来定义类实例构造函数。
在实例构造步骤930期间,使用在诸如C#或Java等编程语言中提供的、通过在此的教导告知以帮助提供阻塞-绑定语义和/或阻塞-绑定线程安全操作的机制,来构造类实例。
在实现执行步骤932期间,作为调用步骤912的结果,在***中执行成员资格实现204的代码。
在线程安全操作执行步骤934期间,例如使用一个或多个成员资格实现过程体500的线程安全版本来对数据集合126执行线程安全操作。
示例代码
记住迄今所提供的关于***、方法和操作环境的信息,下面讨论用于示例实施例的程序代码。实施例不限于在此提供的程序代码,且给定实施例可以包括另外的程序代码、不同的程序代码、用不同的编程语言编写的代码和/或以其他方式背离所提供的示例。对方法实施例的讨论在在示例代码之后继续,且回头参考示例代码。
示例中的代码帮助为实现成员资格接口202的任意数据集合126提供阻塞和绑定支持。在示例中,成员资格接口202至少支持接受要添加到数据集合126的数据元素210并返回指示添加是否成功的结果214的添加操作。此成员资格接口202还支持尝试从数据集合126移除数据元素210并返回指示操作是否成功以及如果成功则返回所移除的数据元素的结果214的移除操作。在此示例中假设这两种操作是线程安全的,这意味着它们支持使用此接口的多个线程120同时访问数据集合126。在此是用C-Sharp实现的这样的成员资格接口202的示例:
public interface IConcurrentCollection<T>
    {
    Boolean TryAdd(T item);
    Boolean TryRemove(out T item);
}
即,“IConcurrentCollection<T>.TryAdd(T item)”是过程标题400的示例,且具体地是添加过程标题402的示例。参数T是数据元素210的示例;数据类型“item”是用于数据元素210的某种类型。在此代码中,“IConcurrentCollection<T>TryRemove(out T item)”是过程标题400的示例,且具体地是移除过程标题404的示例。
数据集合126如何实现接口202和提供线程安全保证的机制的细节被留给数据集合的实现者。作为示例,顺从的线程安全栈可同样使用C-Sharp,在成员资格实现204中被如下实现:
    public class ThreadSafeStack<T>:
IConcurrentCollection<T>
        {
        public bool TryAdd(T item){Push(item);return
    true;}
        public bool TryRemove(out T item){return TryPop(out
    item);}
        private void Push(T item){lock(_stack)
    _stack.Push(item);}
        private bool TryPop(out T item)
        {
        item=default(T);
        lock(_stack)
        {
        if(_stack.Count>0)
        {
        item=_stack.Pop();
        return true;
        }
        }
        return false;
        }
        private Stack<T>_stack=new Stack<T>();
        }
即,例程ThreadSafeStack<T>.TryAdd(),包括用于Push()的代码,是过程体500的示例,且具体地是添加过程体502的示例。同样地,例程ThreadSafeStack<T>.TryRemove(),包括用于TryPop()的代码,是移除过程体504的示例。
ThreadSafeStack<T>的更高效的实现可以使用节点的内部链接列表(其中每一个节点都包含一个数据元素)和用于操纵那些节点的互锁操作来确保线程安全性,从而避免需要昂贵的锁。无论如何,这只是IConcurrentCollection<T>的实现的一个示例。在IConcurrentCollection<T>中,数据集合的实现是未被指定的;该实现仅仅需要顺从接口过程标题400以及其他成员资格接口组件,例如超时接口408和完成接口410(如果它们存在的话)。数据集合126可以具有集合、队列、优先级队列和经排序的列表的形式或其中阻塞和绑定语义可以是相关的任何其他形式的组织结构128。
支持阻塞-绑定包装器206的类型的示例是被称为BlockingCollection<T>的类型,BlockingCollection<T>在下面进行讨论。BlockingCollection<T>可以在并发集合接口的实例周围提供阻塞和绑定行为。用这样的实例来初始化BlockingCollection<T>类型,且BlockingCollection<T>仅知道该实例实现成员资格接口202且不需要关于该实例的内容的任何更多的信息。
BlockingCollection<T>类型还可以支持来自非空数据集合126的初始化,在这种情况下接口202还可以支持诸如用于在数据集合126中检索数据元素210的计数的计数过程标题400等机制。可以在初始化时刻查询这样的计数性质。该计数性质应与TryAdd/TryRemove(尝试添加/尝试移除)方法保持同步,以使得对TryAdd()的成功调用致使计数递增1,对TryRemove()的成功调用致使计数递减1,且不改变数据集合中的数据元素的数量的调用也不改变计数。注意,该构造方法方便创建依赖于特定后备存储的具体类型。例如,可以用C-Sharp创建BlockingStack<T>,如下
public class BlockingStack<T>:BlockingCollection<T>
{
    public BlockingStack():base(new
ThreadSafeStack<T>()){}
}
如前述代码所示,一个方法实施例包括从诸如BlockingCollection<T>等提供阻塞-绑定包装器206的阻塞-绑定类导出926集合类,诸如BlockingStack<T>。该方法还包括将用于集合类的构造函数定义928为成员资格实现204类的实例,诸如ThreadSafeStack<T>。成员资格实现204类提供实现改变数据集合126中的数据元素210的数量的线程安全操作的过程体500,例如Push()或TryPop()。
在许多情况下,导出926类和定义928构造函数可以是最直接的方法,且还支持异类流水线等等。然而,存在其他方法。例如,一个实施例可以包装BlockingCollection<T>而非从其导出,例如:
public class BlockingQueue<T>
{
private BlockingCollection<T>_bc=
new BlockingCollection<T>(
new ConcurrentQueue<T>());
public void Enqueue(T item)
{
_bc.Add(item);
}
public T Dequeue()
{
return_bc.Remove();
}
}
作为另一示例,假设在创建BlockingCollection<T>的实例时,开发者把要使用的底层线程安全集合传递到BlockingCollection(阻塞集合),例如:
    var bc=new BlockingCollection<int>(
new ThreadSafeStack<int>());
前述代码创建整数的ThreadSafeStack的新实例,且然后立即将其包装在BlockingCollection中以便在栈的非阻塞Push/TryPop(进栈/尝试退栈)能力上提供绑定和阻塞Add/Remove(添加/移除)语义。还可以采用稍微简单一些的方法。一实施例可以按照下列实例的各行来创建新类型,而不是使想要阻塞-绑定栈的开发者创建阻塞集合并创建线程安全栈:
class BlockingStack<T>:BlockingCollection<T>
{
public BlockingStack():
base(new ThreadSafeStack<T>()){}
}
现在改为必须编写:
var bc=new BlockingCollection<int>(
new ThreadSafeStack<int>());
开发者可以编写:
var bc=new BlockingStack<int>();
在诸如BlockingCollection<T>等阻塞-绑定包装器206的代码中,可以使用两个信号量。一个信号量604表示数据集合126中的可供移除的数据元素210的计数(用于阻塞)。另一信号量606表示可供添加的未分配存储器空间的量(用于绑定)。
现在参考图10,继续讨论BlockingCollection<T>示例。在初始化步骤1002期间,如果支持非空数据集合126,则BlockingCollection<T>代码向所提供的数据集合查询其项目计数,并使用该计数来将可用项信号量604初始化成该值;否则,可用项信号量604被初始化成当前计数零。如果强制实施绑定,则可用空间信号量606被初始化成绑定计数;如果为强制实施绑定,则顺从实现具有若干选项,诸如将可用空间信号量606初始化成预定最大值(例如Int32.MaxValue),或对于所有相关操作根本不初始化信号量606且然后忽略之。
对BlockingCollection<T>的添加操作可以如下完成。调用912添加过程标题402,例如,导致执行1004Add/TryAdd(添加/尝试添加)调用。在信号量使用步骤1006期间,如果强制实施绑定,则执行等待可用空间信号量606。然后,使用底层接口的添加操作1008来尝试数据元素添加。如果添加成功,则代码释放1010可用项信号量604。如果添加不成功且如果强制实施绑定,则代码释放1012可用空间信号量606。
类似地,对BlockingCollection<T>的移除操作可以如下完成。调用912移除过程标题404,例如,导致执行1014Remove/TryRemove(移除/尝试移除)调用。在信号量使用步骤1016期间,执行等待可用项信号量604。然后,使用底层接口的移除操作1018来尝试数据元素移除。如果移除成功,则代码释放1020可用空间信号量606。如果移除不成功,则不需要释放可用项信号量604,这是因为移除失败指示不存在可用数据元素。
注意,在这些操作中不显式采用锁。信号量实现可以在内部很好地使用锁,且集合实现可以在内部使用锁,但是本发明的方法对于不使用锁且改为用无锁算法实现的数据集合实现也是有用的。因此,一实施例可以提供阻塞和绑定语义的高效实现。尽管如此,在一些实施例中,锁用于提供线程安全性。
锁自由度是一些实施例的性质,在这些实施例中,作为容器(数据集合126)为空的结果而仅仅发生等待。相反,通过使用锁,作为例如多个线程尝试一次从相同的容器取出的结果而引入等待。在一些实施例中,两个线程串行化简单原子递增/递减,且只要在容器中存在足够的项目,这两个线程就可以继续而无需获得更高级的软件锁。
除了这些基本的添加/移除操作之外,BlockingCollection<T>支持各种选项和附加操作。
例如,添加/移动上可以存在结合图4和图5讨论的超时。如果添加或移动操作的一部分超过预定时间限制,则相关信号量可以保持未被修改且其余操作可以被放弃。
作为另一示例,可以存在结合图4和图5讨论的完成。整个BlockingCollection<T>可以被标记为已完成和永久为空,这意味着实例的用户确认将不添加新的数据元素(即,将不再调用添加)。如果集合不是已经为空并阻止任何将来的移除操作等待,则类型支持唤醒在集合变为空时等待的任何移除操作。在一些实施例中,当数据集合被标记为完成之后,不允许另外的添加。唤醒所有等待,且不竞争排出容器数据集合的那些等待(如果存在的话)将返回错误,因为数据集合已变得永久为空;不期望新项目到达。在一些实施例中,数据集合可以类似地被标记为完成和永久为满。
作为又一示例,可以跨越多个BlockingCollection<T>实例执行添加/移动操作。使用例如所展示的BlockingCollection<T>.TryAddAny和BlockingCollection<T>.TryRemoveAny静态方法,可以向任意数量的数据集合126中的任一个添加单个数据元素210,或可以从任意数量的数据集合中的任一个移除单个数据元素。对于添加操作,这可以通过进行非减量式等待任何来自所有可获得的数据集合的可用空间信号量可用并尝试对该BlockingCollection<T>的非阻塞添加操作来实现;如果添加失败,进程可以重复直到成功或直到达到超时。支持用于移除的相似的过程。由于BlockingCollection<T>可以由任意数据集合支持,所以这支持跨异类数据结构,诸如具有不同组织结构128的数据集合126的添加/移动。
在一些实施例中,TryAddAny/TryRemoveAny(尝试添加任一元素/尝试移除任一元素)过程支持向/从任何数量的分块-绑定包装器中的一个添加/移除单个元素。在一些实施例中,提供支持向一组集合中的每一个集合添加数据元素或从该组中的每一个集合移除元素的过程。例如,一实施例可以提供:
public bool TryRemoveAny(
    BlockingCollection [] collections,
    out T item);
public bool TryRemoveAll(
    BlockingCollection [] collections,
    out T [] items);
调用者将取回包含来自每一数据集合的一个项目的实例的数组,而不是取回单个实例。添加/移动的其他变体也是可能的。例如,一实施例可以不限于一次移除一个项目,而可以改为提供一种方法:
public T [] Remove(count);
即,调用者可以将要移除的数据元素的数量指定为计数参数,且执行将阻塞直到可以从集合移除该数量的数据元素,此时所请求的数据元素将在数组中返回。由于效率原因,这可以要求对底层IconcurrentCollection的改变也允许在TryAdd/TryRemove(尝试添加/尝试移除)的重载中指定多个数据元素。多项移除也可以只在包装器中可能用不同的语义来实现。
附加功能的另一示例涉及流水线化。BlockingCollection<T>可用于连接流水线806中的过滤器804,且对于连接802中的每一个,不需要使用相同的底层数据存储。可以在过滤器一和过滤器二之间使用阻塞栈,同时可以在过滤器二和过滤器三之间使用阻塞集合。由于接口不改变,因此过滤器不需要关于支持BlockingCollection<T>的实际数据结构的先验知识,且可以通过从BlockingCollection<T>展示的相同接口来使用该数据结构。
在一些情况下,BlockingCollection<T>添加阻塞和绑定语义。IConcurrentCollection<T>获取附加到其的阻塞和绑定语义。然而,BlockingCollection<T>本身可以是IConcurrentCollection<T>。IConcurrentCollection<T>是展示线程安全TryAdd和TryRemove方法的某一事物。在不需要在接口202中指定数据集合126的组织结构128的意义上,那些TryAdd和TryRemove方法的实际实现是不相关的。IConcurrentCollection<T>可以是栈,在此情况下TryAdd实际上是线程安全进栈操作且TryRemove实际上是线程安全退栈操作。或者,IConcurrentCollection<T>可以是队列,在此情况下TryAdd实际上是线程安全入列操作而TryRemove实际上是线程安全出列操作,等等。在一些场景中,开发者可能想要IConcurrentCollection<T>而不关心实际实现细节,例如栈或队列或别的东西是否被用于组织数据集合中的数据元素。开发者仅仅需要确保实现204提供线程安全TryAdd/TryRemove方法。现在,假设BlockingCollection<T>包装IConcurrentCollection<T>并提供其自己的添加绑定和阻塞语义的TryAdd/TryRemove方法。因为BlockingCollection<T>具有线程安全TryAdd/TryRemove方法,所以除了包装IConcurrentCollection<T>之外,其还满足其自己是IConcurrentCollection<T>的准则。就面向对象而言,BlockingCollection<T>具有IConcurrentCollection<T>并且是IConcurrentCollection<T>。
继续的方法
回头参考示例代码,现在继续讨论方法实施例。一些实施例提供可由软件开发者用来将线程安全数据集合与阻塞-绑定语义包装在一起的方法。
该方法包括获取902成员资格接口202,由此获取904过程标题400,诸如IConcurrentCollection<T>.TryAdd(T item)和/或IConcurrentCollection<T>.TryRemove(out T item)。成员资格接口202提供用于调用912成员资格接口过程来执行改变数据集合126中的数据元素210的数量的线程安全操作的至少一个过程标题400。数据集合126具有未在过程标题中指定的组织结构128(栈、队列等等)。
该方法还包括将成员资格实现204,诸如例程ThreadSafeStack<T>.Push()和ThreadSafeStack<T>.TryPop()与成员资格接口202相关联906。该方法由此关联908实现改变数据集合126中的数据元素210的数量的线程安全操作的至少一个过程体500。在成员资格实现204中数据集合126的组织结构128是专用的,如例如此处的代码所示。
该方法还包括将成员资格接口202和成员资格实现204包装在阻塞-绑定包装器206,诸如BlockingCollection<T>中。阻塞-绑定包装器206响应于成员资格接口过程的调用912而执行以下操作中的至少一个:当数据集合缺乏可供移除的数据元素时对从数据集合126移除数据元素210的尝试执行的阻塞操作,当缺乏添加数据元素所需要的资源,诸如足够的空闲存储器时对向数据集合126添加数据元素210的尝试执行的绑定操作。
一些方法还包括将第二成员资格实现204与成员资格接口202相关联906,以及将第二成员资格实现包装910在阻塞-绑定包装器206中。例如,一种方法支持对于两个数据集合126中的任一个调用TryRemoveAny()。在一些实施例中,被包装在阻塞-绑定包装器中的两个成员资格实现共同实现改变具有彼此不同的组织结构128的两个数据集合126中的数据元素210的数量的线程安全操作。这两个数据集合可以具有不同的集合类型,诸如例如栈和队列,而用于集合126中的数据元素210的底层类型是相同的,例如album_info栈、album_info队列。
一些方法还包括将第二成员资格实现204包装910在阻塞-绑定包装器206的第二实例中并将这两个已包装的成员资格实现放置在数据流水线806中。
一些方法包括在并行处理环境中执行932阻塞-绑定包装的成员资格实现,并行处理环境诸如Microsoft TPL环境、Microsoft PLINQ环境或另一并行处理环境。Microsoft、TPL和PLINQ是微软公司的商标。其他方法在未被配置成并行处理的环境中执行。
经配置的介质
一些实施例提供配置有诸如数据118和指令116等计算机数据和计算机指令的存储介质,该计算机数据和计算机指令用于执行如上面所讨论的提供阻塞-绑定语义的方法。经配置的存储介质可以例如是存储器112,且具体地可以是可移动存储介质114,诸如CD、DVD或闪存。
在一些实施例中,由经配置的介质表征的方法可以是例如用于阻塞-绑定数据集合访问的方法,该方法包括将成员资格实现204与成员资格接口202相关联906的步骤,该成员资格实现被设计成尝试向数据集合126添加数据元素210,并尝试从数据集合移除数据元素,该数据集合具有在成员资格实现中是专用的且未在成员资格接口中指定的组织结构128。这些实施例的方法还包括将成员资格接口和成员资格实现包装910在阻塞-绑定包装器206中,包装器206即响应于成员资格接口过程的调用912而执行下列操作中的至少一个的包装器:当数据集合缺乏可供移除的数据元素时对从数据集合移除数据元素的尝试执行的阻塞操作,当缺乏添加数据元素所需要的资源时对向数据集合添加数据元素的尝试执行的绑定操作。注意,在这些实施例中,线程安全性是可任选的。而且,在这些实施例中使用的软件不一定用使用类继承的语言来编写。然而,在一些实施例中,该方法包括执行导出926类的指令和执行构造930类的实例的指令,如以上代码示例所表示的。
在一些实施例中,成员资格实现204执行至少某些计算机指令以执行934改变数据集合126中的数据元素210的数量的线程安全操作。例如,其中计算机指令可以执行934下列操作中的至少一个:尝试向一组异类数据集合,即并非全都具有相同的组织结构的一组数据集合中的正好一个数据集合添加数据元素的线程安全操作;尝试查找且然后从一组异类数据集合中移除数据元素的线程安全操作。
在一些实施例中,所述方法执行将已包装的成员资格实现的形式的多个连接802放置在数据流水线806中的指令,且这样做是为了访问具有不同组织结构128的数据集合126。
更一般地,在图9或图10所示的或在此以其他方式教导的任何方法步骤可以用于帮助配置存储介质,以由此形成经配置的介质实施例。
结论
如在此所描述的,一些实施例提供表示支持对数据集合126的并发添加和移除所必需的最小线程安全操作集的接口202。一些实施例包括作为用于此最小接口202的实现204的实例的包装器206来提供的阻塞和绑定语义(用于添加和移除)。一些实施例支持向和从任意数量的这些阻塞-绑定集合126中的任一个添加和移除元素210,这些数据集合相对于底层数据组织结构128而言可以是异类的,例如,可以对阻塞栈、阻塞队列和阻塞包进行TryAddAny()。一些实施例支持流水线806,其中用于在流水线中的过滤器804之间进行协调的阻塞集合126可以是异类的。一些实施例包括公共线程安全容器接口202。在一些实施例中,已包装的实现204形式的新容器使用实现此接口的对象来管理容器存储中的数据元素210。此新容器提供阻塞(当为空时挂起执行)和绑定(当为满时挂起),但底层存储容器不需要知道关于阻塞或绑定的任务事物。开发者在构造新容器时通过以实现204的形式提供用于存储的种类的具体对象来配置该新容器。给定实施例的其他方面也可以是值得注意的,这取决于环境。
尽管在此清楚地将特定实施例示出和描述为方法、经配置的介质或***,但应明白,对一种类型的实施例的讨论还一般地扩展到其他实施例类型。例如,结合图9和图10的方法描述还帮助描述经配置的介质以及如结合图1到图8描述的那些***的操作。来自一个实施例的限制不一定施加于另一个实施例。具体地,各方法不限于在讨论***时呈现的数据结构和安排。
在全文中已经通过附图标记来参考附图。与附图或文本中的给定附图标记相关联的措辞中的任何明显的不一致性应被理解成仅仅是拓宽了标号引用的内容的范围。
如此处所使用的,诸如“一”和“该”等术语包含所指示的项目或步骤中的一个或多个。具体地,在权利要求中,对项目的引用一般意味着存在至少一个这样的项目,且对步骤的引用意味着执行该步骤的至少一个实例。
标题仅仅是为了方便;关于给定主题的信息可以在其标题指示该主题的章节之外找到。
所提交的所有权利要求是本说明书的一部分。
尽管已经在附图中示出并在上面描述示例性实施例,但本领域的普通技术人员应明白,可以在不背离权利要求中所阐述的原理和概念的情况下下做出众多修改。尽管已经用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述具体特征或动作。在每一个实施例中不一定存在或利用在给定定义或示例中标识的每一手段和方面。相反,所描述的具体特征和动作是作为供在实现权利要求时考虑的示例而公开的。
在法律所准许最大范围内,落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书的范围所涵盖。

Claims (15)

1.一种可由软件开发者用来将线程安全数据集合与阻塞-绑定语义包装在一起的方法,所述方法包括以下步骤:
获取(902)成员资格接口(202),即获取(904)用于调用成员资格接口过程来执行改变数据集合(126)中的数据元素(210)的数量的线程安全操作的至少一个过程标题(400),所述数据集合具有未在所述过程标题中指定的组织结构(128)
将成员资格实现(204)与所述成员资格接口相关联(906),即关联(908)实现改变所述数据集合中的数据元素的数量的线程安全操作的至少一个过程体(500),所述数据集合的组织结构在所述成员资格实现中是专用的;以及
将所述成员资格接口和所述成员资格实现包装(910)在阻塞-绑定包装器(206)中,所述包装器(206)即响应于所述成员资格接口过程的调用而执行下列操作中的至少一个的包装器:在所述数据集合缺少可供移除的数据元素时对从所述数据集合中移除数据元素的尝试执行的阻塞操作(916)在缺少添加所述数据元素所需要的资源时对向所述数据集合添加所述数据元素的尝试执行的绑定操作(920)。
2.如权利要求1所述的方法,其特征在于,被包装在所述阻塞-绑定包装器(206)中的两个成员资格实现(204)共同实现改变具有彼此不同的组织结构(128)的两个数据集合(126)中的数据元素的数量的线程安全操作。
3.如权利要求1所述的方法,其特征在于,还包括将第二成员资格实现(204)包装(910)在所述阻塞-绑定包装器(206)的第二实例中,并且将所述两个已包装的成员资格实现放置(924)在数据流水线(806)中。
4.如权利要求1所述的方法,其特征在于,所述方法包括:从提供所述阻塞-绑定包装器(206)的阻塞-绑定类导出(926)集合类;以及将用于所述集合类的构造函数定义(928)为提供实现改变所述数据集合中的数据元素(126)的数量的线程安全操作的过程体(500)的实现类的实例。
5.如权利要求1所述的方法,其特征在于,还包括在并行处理环境中执行(932)阻塞-绑定包装的成员资格实现(204)。
6.一个多线程计算机***(102),包括:
配置有可执行指令(116)的至少一个存储器(112);
至少一个逻辑处理器(110),其被配置成执行所述指令的至少一部分以执行改变数据集合(126)中的成员的数量的线程安全和阻塞-绑定操作;
成员资格接口(202),其配置所述存储器并被设计成调用改变数据集合中的数据元素的数量的线程安全操作,所述数据集合具有未在所述成员资格接口中指定的组织结构(128);
成员资格实现(204),其配置所述存储器并且与所述成员资格接口相关联,所述成员资格接口即实现改变所述数据集合中的数据元素的数量的线程安全操作的指令(116),所述数据集合的组织结构在所述成员资格实现中是专用的;以及
阻塞-绑定包装器(206),其配置所述存储器并包装所述成员资格实现,且被配置成执行指令(116)以便响应于对所述成员资格接口的调用而执行下列阻塞-绑定操作中的至少一个:将在所述数据集合缺少可供移除的数据元素时对从所述数据集合中移除数据元素的尝试执行的阻塞操作(916),将在缺少添加所述数据元素所需要的资源时对向所述数据集合添加数据元素的尝试执行的绑定操作(920)。
7.如权利要求6所述的***,其特征在于,所述成员资格接口包括:
用于调用线程安全数据集合添加操作的添加过程标题(402),所述线程安全数据集合添加操作即将接受数据元素,尝试向所述数据集合添加数据元素并返回指示所述添加尝试的结果的状态的线程安全操作;以及
用于调用线程安全数据集合移除操作的移除过程标题(404),所述线程安全数据集合移除操作即将尝试从数据集合中移除数据元素并至少返回所述移除尝试的结果的指示的线程安全操作。
8.如权利要求6所述的***,其特征在于,所述成员资格接口包括用于调用线程安全数据集合查找并移除操作的查找并移除过程标题(406),所述线程安全数据集合查找并移除操作即将尝试在数据集合中查找匹配至少一个指定数据元素准则的数据元素,如果找到则将尝试移除这样的数据元素并将至少返回所述查找并移除尝试的结果的指示的线程安全操作。
9.如权利要求6所述的***,其特征在于,还包括成员资格改变超时值(508),由此如果尝试改变数据集合的成员资格所花费的时间超过所述超时值,则阻塞-绑定操作超时并返回失败指示。
10.如权利要求6所述的***,其特征在于,所述***包括配置存储器(112)的多个数据集合(126),所述数据集合共同展示至少两种不同的组织结构(128),并且所述可执行指令(116)包括以下指令中的至少一个:被设计成使用线程安全绑定操作来尝试向所述数据集合中的任一个添加数据元素的的指令,被设计成使用线程安全阻塞操作来尝试从所述数据集合中的任一个中移除数据元素的指令。
11.如权利要求6所述的***,其特征在于,所述***还包括用于将所述数据集合标记为已完成的完成接口(410)。
12.如权利要求6所述的***,其特征在于,所述阻塞-绑定包装器(206)本身包括扼流信号量(604,606)且不包含线程安全锁。
13.一种存储介质(114),其配置有用于执行用于阻塞-绑定数据集合访问的方法的计算机数据(118)和计算机指令(116),所述方法包括下列步骤:
将成员资格实现(204)与成员资格接口相关联(906),所述成员资格实现被设计成尝试向数据集合添加数据元素到并尝试从数据集合(126)移除数据元素(210),所述数据集合具有在所述成员资格实现中专用且未在所述成员资格接口中指定的组织结构(128);以及
将所述成员资格接口和所述成员资格实现包装(910)在阻塞-绑定包装器(206)中,所述阻塞-绑定包装器(206)即响应于对成员资格接口过程的调用而执行下列操作中的至少一个的包装器:在所述数据集合缺少可供移除的数据元素时对从数据集合移除数据元素的尝试执行的阻塞操作,在缺少添加所述数据元素所需要的资源时对向所述数据集合添加数据元素的尝试执行的绑定操作。
14.如权利要求13所述的经配置的介质,其特征在于,所述方法包括执行导出(926)类的指令和执行构造(930)类的实例的指令。
15.如权利要求13所述的经配置的存储介质,其特征在于,所述计算机指令执行下列操作中的至少一个:
尝试向一组异类数据集合,即并非全都具有相同的组织结构的一组数据集合中的恰好一个数据集和添加(918)数据元素的线程安全操作;
尝试从一组异类数据集合中的恰好一个数据集合中移除(914)数据元素的线程安全操作;
尝试查找且然后从一组异类数据集合中移除(922)数据元素的线程安全操作。
CN2009801212067A 2008-06-02 2009-05-01 用于线程安全数据集合的阻塞和绑定包装器 Active CN102047222B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/131,123 US8356308B2 (en) 2008-06-02 2008-06-02 Blocking and bounding wrapper for thread-safe data collections
US12/131,123 2008-06-02
PCT/US2009/042615 WO2009148740A2 (en) 2008-06-02 2009-05-01 Blocking and bounding wrapper for thread-safe data collections

Publications (2)

Publication Number Publication Date
CN102047222A true CN102047222A (zh) 2011-05-04
CN102047222B CN102047222B (zh) 2013-09-25

Family

ID=41381556

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009801212067A Active CN102047222B (zh) 2008-06-02 2009-05-01 用于线程安全数据集合的阻塞和绑定包装器

Country Status (7)

Country Link
US (1) US8356308B2 (zh)
EP (1) EP2300914B1 (zh)
KR (1) KR101600644B1 (zh)
CN (1) CN102047222B (zh)
AU (1) AU2009255465B2 (zh)
BR (1) BRPI0910533B1 (zh)
WO (1) WO2009148740A2 (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108197032A (zh) * 2018-01-23 2018-06-22 武汉斗鱼网络科技有限公司 Ios应用的主线程卡顿监测方法、介质、设备及***
CN115794356A (zh) * 2023-01-31 2023-03-14 深圳方位通讯科技有限公司 基于ssh服务器的多线程同步连接处理方法

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8499298B2 (en) * 2010-01-28 2013-07-30 International Business Machines Corporation Multiprocessing transaction recovery manager
US8738878B2 (en) 2012-04-02 2014-05-27 Apple Inc. Lock-free object recycling
US10002031B2 (en) * 2013-05-08 2018-06-19 Nvidia Corporation Low overhead thread synchronization using hardware-accelerated bounded circular queues
WO2016134318A1 (en) * 2015-02-19 2016-08-25 Makoto Odamaki Systems, methods, and media for modular cameras
US10798146B2 (en) * 2015-07-01 2020-10-06 Oracle International Corporation System and method for universal timeout in a distributed computing environment

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5481706A (en) * 1993-11-01 1996-01-02 International Business Machines Corporation System and method for creating thread-safe shared libraries
US20020059358A1 (en) * 1997-07-17 2002-05-16 Microsoft Corporation Method and system for accessing objects of different thread types
US20070234368A1 (en) * 2006-03-31 2007-10-04 Microsoft Corporation Providing a wrapper around native synchronization objects
US20080066066A1 (en) * 2006-09-08 2008-03-13 Macpherson Michael B Task queue suitable for processing systems that use multiple processing units and shared memory

Family Cites Families (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5519867A (en) * 1993-07-19 1996-05-21 Taligent, Inc. Object-oriented multitasking system
US5473777A (en) * 1993-07-19 1995-12-05 Moeller; Christopher P. Wrapper for enabling an object otented application to maintain virtual memory using procedural function calls
US5379432A (en) * 1993-07-19 1995-01-03 Taligent, Inc. Object-oriented interface for a procedural operating system
US5465363A (en) * 1993-12-30 1995-11-07 Orton; Debra L. Wrapper system for enabling a non-multitasking application to access shared resources in a multitasking environment
US6615216B1 (en) * 2000-06-29 2003-09-02 Microsoft Corporation Lock free data structure maintenance
US7017162B2 (en) * 2001-07-10 2006-03-21 Microsoft Corporation Application program interface for network software platform
US7908441B2 (en) * 2002-01-11 2011-03-15 Oracle America, Inc. Value recycling facility for multithreaded computations
US7069396B2 (en) * 2002-06-27 2006-06-27 Hewlett-Packard Development Company, L.P. Deferred memory allocation for application threads
US7328316B2 (en) * 2002-07-16 2008-02-05 Sun Microsystems, Inc. Software transactional memory for dynamically sizable shared data structures
US20040107227A1 (en) * 2002-12-03 2004-06-03 International Business Machines Corporation Method for efficient implementation of dynamic lock-free data structures with safe memory reclamation
US7237242B2 (en) * 2002-12-31 2007-06-26 International Business Machines Corporation Dynamic thread pool tuning techniques
US7353495B2 (en) * 2003-02-28 2008-04-01 Bea Systems, Inc. Method for protection against interleaving transactions using a transaction manager
US7219198B2 (en) * 2004-06-22 2007-05-15 International Business Machines Corporation Facilitating communication within shared memory environments using lock-free queues
US20060015872A1 (en) * 2004-07-13 2006-01-19 Pohl William N Process management
US7366831B2 (en) * 2005-09-30 2008-04-29 Intel Corporation Lock-free bounded FIFO queue mechanism
US7958512B2 (en) * 2005-10-31 2011-06-07 Microsoft Corporation Instrumentation to find the thread or process responsible for an application failure

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5481706A (en) * 1993-11-01 1996-01-02 International Business Machines Corporation System and method for creating thread-safe shared libraries
US20020059358A1 (en) * 1997-07-17 2002-05-16 Microsoft Corporation Method and system for accessing objects of different thread types
US20070234368A1 (en) * 2006-03-31 2007-10-04 Microsoft Corporation Providing a wrapper around native synchronization objects
US20080066066A1 (en) * 2006-09-08 2008-03-13 Macpherson Michael B Task queue suitable for processing systems that use multiple processing units and shared memory

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
BENTON,N.等: "modern concurrency abstractions for C#", 《ACM TRANSACTIONS ON PROGRAMMING LANGUAGES AND SYSTEMS》 *
LEA ET AL.: "the java.util.concurrent synchronizer framework", 《SCIENCE OF COMPUTER PROGRAMMING》 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108197032A (zh) * 2018-01-23 2018-06-22 武汉斗鱼网络科技有限公司 Ios应用的主线程卡顿监测方法、介质、设备及***
CN108197032B (zh) * 2018-01-23 2021-04-27 武汉斗鱼网络科技有限公司 Ios应用的主线程卡顿监测方法、介质、设备及***
CN115794356A (zh) * 2023-01-31 2023-03-14 深圳方位通讯科技有限公司 基于ssh服务器的多线程同步连接处理方法
CN115794356B (zh) * 2023-01-31 2023-04-28 深圳方位通讯科技有限公司 基于ssh服务器的多线程同步连接处理方法

Also Published As

Publication number Publication date
AU2009255465B2 (en) 2014-06-26
CN102047222B (zh) 2013-09-25
US20090300766A1 (en) 2009-12-03
WO2009148740A2 (en) 2009-12-10
BRPI0910533B1 (pt) 2019-10-29
EP2300914A2 (en) 2011-03-30
EP2300914B1 (en) 2016-06-22
KR20110025744A (ko) 2011-03-11
EP2300914A4 (en) 2011-10-05
BRPI0910533A2 (pt) 2015-09-29
KR101600644B1 (ko) 2016-03-07
US8356308B2 (en) 2013-01-15
AU2009255465A1 (en) 2009-12-10
WO2009148740A3 (en) 2010-02-18

Similar Documents

Publication Publication Date Title
AU2019268140B2 (en) Compilation of graph-based program specifications with automated clustering of graph components based on the identification of particular data port connections
AU2019257543B2 (en) Executing graph-based program specifications
US10896025B2 (en) Specifying components in graph-based programs
US10338782B2 (en) Specifying control and data connections in graph-based programs
CN102047222B (zh) 用于线程安全数据集合的阻塞和绑定包装器
US9760406B2 (en) Controlling data processing tasks
EP3189419B1 (en) Managing invocation of tasks
EP3189420B1 (en) Managing execution state of components in a graph-based program specification for controlling their associated tasks
CN101681292B (zh) 使用事务来并行化顺序框架的方法
EP3189432A2 (en) Controlling data processing tasks
Gijsbers et al. An efficient scalable runtime system for macro data flow processing using S-Net
Hasselbring On integrating generative communication into the prototyping language ProSet
Marathe et al. Featherweight transactions: decoupling threads and atomic blocks
Botev Actor-based Concurrency in Newspeak 4

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: 20150512

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20150512

Address after: Washington State

Patentee after: Micro soft technique license Co., Ltd

Address before: Washington State

Patentee before: Microsoft Corp.