專利名稱:用于線程安全數(shù)據(jù)集合的阻塞和綁定包裝器的制作方法
用于線程安全數(shù)據(jù)集合的阻塞和綁定包裝器背景已經(jīng)以各種配置設(shè)計多線程環(huán)境。執(zhí)行線程可以并行運行,或線程可以被組織成 并行執(zhí)行但實際上按順序輪流執(zhí)行??梢岳缤ㄟ^在多處理環(huán)境中在不同的核心上運行不 同的線程、通過對單個處理器核心上的不同線程進行時間分片、或通過時間分片和多處理 器線程的某種組合來實現(xiàn)多線程。可以例如通過內(nèi)核的線程調(diào)度器、通過用戶-空間信號、 或通過用戶-空間和內(nèi)核操作的組合來啟動線程上下文切換。多處理器環(huán)境出現(xiàn)在各種配置中。在一種給定配置中,所有處理器可以在功能上 相同,然而在另一配置中,一些處理器可能由于具有不同的硬件能力、不同的軟件指派或兩 者而不同于其他處理器。取決于配置,處理器可以在單個總線上彼此緊密地耦合,或它們可 以松耦合。在一些配置中,處理器共享中央存儲器,在一些配置中,它們各自具有其自己的 本地存儲器,并且在一些配置中,存在共享存儲器和本地存儲器兩者。概述在一些實施例中,成員資格接口支持改變數(shù)據(jù)集合中的數(shù)據(jù)元素的數(shù)量的操作。 成員資格實現(xiàn)與成員資格接口相關(guān)聯(lián)。數(shù)據(jù)集合具有在成員資格接口中未指定但是在成員 資格實現(xiàn)中是專用的組織結(jié)構(gòu)。成員資格實現(xiàn)上的阻塞-綁定包裝器響應(yīng)于成員資格接口 的調(diào)用而執(zhí)行阻塞-綁定操作。例如,在一些實施例中,當數(shù)據(jù)集合缺少可供移除的數(shù)據(jù)元 素時,阻塞操作在嘗試從數(shù)據(jù)集合中移除數(shù)據(jù)元素期間掛起執(zhí)行。類似地,在一些實施例 中,當缺少添加數(shù)據(jù)元素所需要的存儲器空間或另一資源時,綁定操作在嘗試將數(shù)據(jù)元素 添加到數(shù)據(jù)集合期間掛起執(zhí)行。在一些實施例中,阻塞-綁定包裝器為支持最小接口的任何數(shù)據(jù)集合,例如提供 添加元素過程和移除元素過程的數(shù)據(jù)集合提供阻塞和綁定支持。具體地,一些實施例支持 對添加或移除數(shù)據(jù)元素的線程安全操作的阻塞和綁定。在一些實施例中,組合阻塞-綁定 語義和線程安全操作,同時管理多個異類數(shù)據(jù)集合。給定示例僅僅是說明性的。本發(fā)明內(nèi)容并不旨在標識出所要求保護的主題的關(guān)鍵 特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。相反,提供本概述是為了以 簡化的形式介紹將在以下詳細描述中進一步描述的一些概念。本發(fā)明用權(quán)利要求來限定, 并且如果本概述與權(quán)利要求沖突,則應(yīng)以權(quán)利要求為準。
將參考附圖來給出更具體的描述。這些圖僅示出所選擇的方面且因而并不完全地 確定有效范圍或范圍。圖1是示出操作環(huán)境中的多線程計算機系統(tǒng)和經(jīng)配置的存儲介質(zhì)實施例的框圖;圖2是進一步示出配置有成員資格接口、成員資格實現(xiàn)、阻塞-綁定包裝器和至少 一個數(shù)據(jù)集合的多線程計算機系統(tǒng)的框圖;圖3是示出包括使用數(shù)據(jù)集合、成員資格接口、成員資格實現(xiàn)、阻塞-綁定包裝器 和多個數(shù)據(jù)集合的軟件的配置的框圖4是進一步示出成員資格接口的框圖;圖5是進一步示出成員資格實現(xiàn)的框圖;圖6是進一步示出阻塞-綁定包裝器、單獨的線程安全機制和數(shù)據(jù)集合的框圖;圖7是示出包括成員資格接口、成員資格實現(xiàn)、阻塞-綁定包裝器和多個數(shù)據(jù)集合 的配置的框圖,這些數(shù)據(jù)集合是異類的,因為它們共同地具有多個組織結(jié)構(gòu);圖8是示出將成員資格實現(xiàn)包裝在數(shù)據(jù)流水線中的阻塞-綁定的框圖;圖9是示出一些方法的步驟和經(jīng)配置的存儲介質(zhì)實施例的流程圖;以及圖10是使用具體的Clharp程序示例來進一步示出一些方法的步驟和經(jīng)配置的 存儲介質(zhì)實施例的流程圖。詳細描述概覽阻塞語義已經(jīng)依賴于特定的數(shù)據(jù)結(jié)構(gòu),例如在阻塞隊列的情況下的隊列,或在阻 塞棧的情況下的棧。阻塞隊列在文獻中被討論并且出現(xiàn)在廣泛使用的框架中。在出列操作 的執(zhí)行期間,阻塞隊列支持等待隊列變成非空的。在入列操作(也稱為綁定)的執(zhí)行期間, 一些阻塞隊列可選地支持等待隊列變成非滿。存在類型變體,例如,諸如實現(xiàn)阻塞和綁定棧 的具體類型,或阻塞和綁定集。阻塞和綁定數(shù)據(jù)結(jié)構(gòu)實現(xiàn)同步訪問以便防止多個線程同時 修改數(shù)據(jù)結(jié)構(gòu)是不尋常的,盡管可以以相當大的性能代價來實現(xiàn)同步。如果阻塞和綁定語義可以被應(yīng)用到其實現(xiàn)被外部地提供的任意集合,則它們可以 是更一般地有用的。例如,可以實現(xiàn)優(yōu)先級隊列而不考慮綁定和阻塞,且然后將綁定和阻 塞行為應(yīng)用到該優(yōu)先級隊列,以便在需要阻塞和綁定語義的情況下使用優(yōu)先級隊列。對于 其他數(shù)據(jù)集合組織結(jié)構(gòu),相似的使用可以出現(xiàn)在具有阻塞-綁定的經(jīng)排序的列表、具有阻 塞-綁定的未經(jīng)排序的包等。在此討論的一些實施例以對于實際上用于數(shù)據(jù)集合的數(shù)據(jù)結(jié)構(gòu)的類型或?qū)崿F(xiàn)不 可知的方式在線程安全數(shù)據(jù)集合上提供阻塞和綁定語義。所定義的成員資格接口標識修改 數(shù)據(jù)集合的方式,且接口的具體實現(xiàn)實現(xiàn)相關(guān)的方法。所支持的數(shù)據(jù)結(jié)構(gòu)不需要在先知道 實現(xiàn)阻塞-綁定語義的類型,這是因為數(shù)據(jù)集合僅僅需要實現(xiàn)至少提供線程安全添加和移 除操作的最小接口。此外,實施例僅僅需要顯式地同步對表示底層數(shù)據(jù)集合中的可用數(shù)據(jù) 元素的數(shù)量的計數(shù)信號量的訪問,且并不需要同步對數(shù)據(jù)集合本身的訪問。數(shù)據(jù)集合實現(xiàn) 在內(nèi)部提供線程安全性語義且通過接口屏蔽,且其可以以對于相關(guān)數(shù)據(jù)結(jié)構(gòu)而言盡可能高 效的方式來這樣做。例如,在棧的情況下,可以利用用于無鎖棧實現(xiàn)的公知算法。非線程安 全集合還可以被包裝在實現(xiàn)成員資格接口的線程安全包裝器中?,F(xiàn)在將參考諸如附圖中示出的示例性實施例,且在此將使用專用語言來描述這些 示例性實施例。但是,相關(guān)領(lǐng)域的技術(shù)人員和擁有本發(fā)明的人應(yīng)想到的、對在此所示出的特 征的更改和進一步的修改以及對在此示出的原理的其他應(yīng)用應(yīng)被認為是在權(quán)利要求的范 圍內(nèi)。在本發(fā)明中闡述術(shù)語的含義,所以應(yīng)仔細關(guān)注這些闡述來閱讀權(quán)利要求。給出具 體示例,但是相關(guān)領(lǐng)域的技術(shù)人員將理解,其他示例也可以落在所使用的術(shù)語的含義內(nèi)且 落在一個或多個權(quán)利要求的范圍內(nèi)。術(shù)語在這里并不一定具有它們在一般的用法中、在特 定的行業(yè)的用法中或在特定字典或字典集中具有的相同含義。附圖標記可以與各種措辭一起使用,以幫助示出術(shù)語的廣度。從給定文本段中忽略參考數(shù)字并不一定意味著圖的內(nèi)容 沒有被該文本討論。發(fā)明人斷言他們的權(quán)利并將其運用至他們自己的詞典學。在此,在詳 細描述中和/或在申請文件中的其他地方,術(shù)語可以被顯式或隱式定義。在此所使用的“計算機系統(tǒng)”可以包括,例如一個或多個服務(wù)器、主板、處理節(jié)點、 個人計算機(便攜式或非便攜式)、個人數(shù)字助理、蜂窩或移動電話和/或提供至少部分地 通過指令控制的一個或多個處理器的設(shè)備。指令可以具有存儲器和/或?qū)S秒娐分械能浖?的形式。具體地,盡管可以出現(xiàn)許多實施例在服務(wù)器計算機上運行的情況,但是其他實施例 可以在其他計算設(shè)備上運行,且任何一個或多個這樣的設(shè)備可以是給定實施例的一部分?!岸嗑€程計算機系統(tǒng)”是支持多個執(zhí)行線程的計算機系統(tǒng)。線程可以并行、串行運 行或以并行執(zhí)行(例如,多處理)和串行執(zhí)行(例如,時間分片)的組合運行。“邏輯處理器”或“處理器”是單個獨立硬件線程。例如,每一核心運行兩個線程的 超線程四核芯片具有八個邏輯處理器。處理器可以是通用的,或它們可以被定制為專用的, 例如圖形處理、信號處理、浮點算術(shù)處理、加密、I/O處理等。在此所使用的涉及數(shù)據(jù)結(jié)構(gòu)的術(shù)語僅僅如它們的表達限定詞那樣具體。例如,在 沒有進一步限定的情況下,術(shù)語“列表”包括鏈接列表和使用數(shù)組實現(xiàn)的列表兩者。只要參考數(shù)據(jù)集合或其他數(shù)據(jù)結(jié)構(gòu),應(yīng)理解,與簡單地存在于紙上相反,數(shù)據(jù)結(jié)構(gòu) 在程序員的頭腦中或例如作為導(dǎo)線上的瞬時信號配置計算機可讀存儲器。操作環(huán)境參考圖1,用于一實施例的操作環(huán)境100可以包括,例如多線程計算機系統(tǒng)102。盡 管多線程計算機系統(tǒng)在此被呈現(xiàn)為示例,但是也可以使用不是多線程的計算機系統(tǒng)來提供 實施例。同樣地,一些實施例被配置為多處理,而其他實施例未被配置為多處理。人類用戶 104可以通過使用屏幕、鍵盤和其他外圍設(shè)備106與多線程計算機系統(tǒng)102或與一實施例中 的另一計算機系統(tǒng)交互。在一些實施例中,存儲設(shè)備和/或聯(lián)網(wǎng)設(shè)備可以被認為是外圍裝 備。本身可以是或不是多線程或多處理的其他計算機系統(tǒng)(未示出),可以經(jīng)由例如網(wǎng)絡(luò)接 口裝備使用一個或多個網(wǎng)絡(luò)連接來與多線程計算機系統(tǒng)102或與另一系統(tǒng)實施例交互。多線程計算機系統(tǒng)102包括執(zhí)行一個或多個線程120的至少一個邏輯處理器110。 其他計算機系統(tǒng)實施例還將含有至少一個處理器,但是將不一定含有線程。多線程計算機 系統(tǒng)102如同其他合適的系統(tǒng)一樣,還包括一個或多個存儲器112。存儲器112可以是易失 性的、非易失性的、固定的、可移動的、磁性的、光學的和/或是其他類型。具體地,當被插入 或以其他方式安裝時,經(jīng)配置的介質(zhì)114,諸如CD、DVD、記憶棒或其他可移動非易失性存儲 器介質(zhì)可以在功能上變成多線程計算機系統(tǒng)102的一部分,使得其內(nèi)容可訪問以供處理器 110使用。經(jīng)配置的可移動介質(zhì)114是存儲器112的示例。存儲器112的其他示例包括內(nèi) 置RAM、ROM、硬盤和用戶104不容易移動的其他存儲設(shè)備。介質(zhì)114配置有可由處理器110執(zhí)行的指令116。介質(zhì)114還配置有通過執(zhí)行指 令116來創(chuàng)建、修改、引用和/或以其他方式使用的數(shù)據(jù)118。數(shù)據(jù)118可以包括數(shù)據(jù)結(jié)構(gòu), 某些數(shù)據(jù)結(jié)構(gòu)可以被組織在具有特定組織結(jié)構(gòu)128的數(shù)據(jù)集合126中。指令116和數(shù)據(jù) 118配置它們駐留在其中的存儲器112/介質(zhì)114 ;當該存儲器是給定計算機系統(tǒng)的功能部 分時,指令116和數(shù)據(jù)118還配置該計算機系統(tǒng)。為了說明清楚,存儲器112在圖1中以單 個框來示出,但是應(yīng)理解,存儲器可以具有不同的物理類型,且在附圖中示出的線程120、數(shù)據(jù)118、軟件和其他項目可以部分地或完全駐留在一個或多個存儲器112中,由此配置那些 存儲器。在給定操作環(huán)境中,多線程計算機系統(tǒng)102或另一計算機系統(tǒng)可以運行一個或多 個應(yīng)用程序122,可以運行操作系統(tǒng)124,且可以使用現(xiàn)在已知或在下文中形成的任何網(wǎng)絡(luò) 接口裝備。具體地,應(yīng)用程序122可以是嵌入式的??梢源嬖谥T如存儲器分配和無用信息 收集例程、句柄管理器等資源管理器130。上面未明確命名的其他軟件和/或硬件132也可 以存在于給定配置中。操作環(huán)境可以包括一個或多個多線程計算機系統(tǒng)或非多線程計算機系統(tǒng)。這些計 算機系統(tǒng)可以群集、客戶機一服務(wù)器聯(lián)網(wǎng)和/或?qū)Φ嚷?lián)網(wǎng)。一些操作環(huán)境包括獨立(非聯(lián) 網(wǎng)的)計算機系統(tǒng)。用于一些實施例的合適的操作環(huán)境中的某一些包括Microsoft . NET 環(huán)境(微 軟公司的商標)。一些合適的操作環(huán)境包括Java. 環(huán)境(Sim微系統(tǒng)有限公司的商標),且 一些合適的操作環(huán)境包括利用例如C++或C#( “C-Sharp")等語言的環(huán)境。系統(tǒng)現(xiàn)在參考圖1到圖8,一些實施例包括配置有成員資格接口 202、成員資格實現(xiàn)204 和阻塞-綁定包裝器206的計算機系統(tǒng)。這些組件中的每一個在下面更詳細地討論。一些實施例包括經(jīng)配置的計算機可讀存儲介質(zhì)114,其是存儲器112的示例。存儲 器112可以包括盤(磁盤、光盤或其他)、RAM、EEPROM或其他ROM和/或其他可配置存儲 器??梢允强梢苿拥幕虿豢梢苿拥那铱梢允且资曰蚍且资缘耐ㄓ么鎯ζ?12可以被配 置成使用從可移動介質(zhì)114和/或諸如網(wǎng)絡(luò)連接等另一源讀取的對應(yīng)數(shù)據(jù)118和指令116 的形式的組件,諸如成員資格接口 202、成員資格實現(xiàn)204和阻塞-綁定包裝器206的實施 例,以便由此形成經(jīng)配置的存儲器112的形式的經(jīng)配置的介質(zhì),該經(jīng)配置的介質(zhì)能夠使計 算機系統(tǒng)以在此公開的類型不可知方式執(zhí)行阻塞-綁定包裝器放置和/或利用步驟并提供 阻塞-綁定語義。圖1到圖8因而有助于示出經(jīng)配置的存儲介質(zhì)實施例和方法實施例以及 系統(tǒng)實施例。在一些實施例中,將存在與一個或多個處理器110和存儲器112在操作上通信的 外圍裝備,諸如人類用戶I/O設(shè)備(屏幕、鍵盤、鼠標、話筒、揚聲器、運動傳感器等)。然而, 實施例還可以被深度嵌入在系統(tǒng)中,以使得人類用戶104不能直接與該實施例交互。在一些實施例中,例如,計算機系統(tǒng)中將存在使用諸如分組交換網(wǎng)絡(luò)接口卡、無線 收發(fā)器或電話網(wǎng)絡(luò)接口的組件來提供對網(wǎng)絡(luò)108的接入的聯(lián)網(wǎng)接口裝備。然而,一實施例 還可以通過直接存儲器存取、可移動非易失性介質(zhì)或其他信息存儲-檢索和/或傳輸方法 來進行通信,或計算機系統(tǒng)中的實施例可以在不與其他計算機系統(tǒng)通信的情況下操作。如圖2所示,多線程計算機系統(tǒng)102可以配置有成員資格接口 202、成員資格實現(xiàn) 204和阻塞-綁定包裝器206。線程120也存在于所示配置中,線程120的執(zhí)行至少部分地 通過線程調(diào)度器208來調(diào)度。線程120可以使用成員資格實現(xiàn)中的例程來嘗試訪問給定數(shù) 據(jù)集合126的各個數(shù)據(jù)元素210。線程安全機制212存在于例如成員資格實現(xiàn)204中,用 以幫助防止由于使得兩個線程同時訪問數(shù)據(jù)集合而引起的不一致性。合適的線程安全機制 可以包括例如實現(xiàn)互斥和/或原子操作的鎖。訪問嘗試可以向數(shù)據(jù)集合1 添加數(shù)據(jù)元素 210、從數(shù)據(jù)集合1 移除數(shù)據(jù)元素210、掛起線程120的執(zhí)行和/或失敗。由訪問嘗試返回的結(jié)果214可以包括數(shù)據(jù)元素210、狀態(tài)碼或兩者。參考圖3到圖8,一實施例不一定需要多線程計算機系統(tǒng)102。一些實施例使用不 是多線程的計算機系統(tǒng)。一些實施例包括單個邏輯處理器110,且一些實施例包括多個邏 輯處理器。一些實施例是多線程的并被配置為允許至少兩個線程在不同的邏輯處理器上執(zhí) 行。一些實施例在單個處理器上多線程運行。當然,給定實施例中需要的組件由權(quán)利要求 控制,而不是由附圖控制。如圖3所示,一些實施例包括多個數(shù)據(jù)集合126,或至少提供對多個數(shù)據(jù)集合1 的訪問。在一些實施例中,所有數(shù)據(jù)集合1 具有相同的數(shù)據(jù)元素210類型;在其他實施例 中,存在不同類型的數(shù)據(jù)元素210。在一些實施例中,所有的數(shù)據(jù)集合1 具有相同的組織 結(jié)構(gòu)128,例如,它們?nèi)勘唤M織為棧,或它們?nèi)勘唤M織為FIFO隊列。在其他實施例中,存 在至少兩個不同的組織結(jié)構(gòu)128。具體地,且并不限制前述內(nèi)容,一些實施例包括多個數(shù)據(jù) 集合126,或至少提供對多個數(shù)據(jù)集合126的訪問,這些數(shù)據(jù)集合1 具有相同的底層數(shù)據(jù) 元素210類型但是具有不同的組織結(jié)構(gòu)128。例如,一實施例可以提供對一個數(shù)據(jù)集合中的 game_event元素棧和另一數(shù)據(jù)集合中的game_event元素包的統(tǒng)一訪問。如還由圖3所示,嘗試訪問數(shù)據(jù)元素210的軟件可以具有不同種類。一實施例的 各方面可以用于例如向應(yīng)用程序122、操作系統(tǒng)IM或其他軟件提供阻塞-綁定數(shù)據(jù)元素訪 問。具體地,一實施例的各方面可以用于為運行多個線程的軟件提供用于對數(shù)據(jù)集合的線 程安全操作的阻塞-綁定訪問語義。如圖4所示,成員資格接口的一些實施例包括一個或多個“過程標題”。過程標題 可以被實現(xiàn)為方法簽名、類型簽名、過程說明、方法聲明等等。過程標題提供諸如函數(shù)或其 他軟件例程的名稱、例程所期望的參數(shù)和值(如果例程返回的話)等信息。圖4示出用于成員資格接口 202的可能的過程標題400中的三個。添加過程標題 402將接口定義為嘗試向數(shù)據(jù)集合1 添加數(shù)據(jù)元素210的一個或多個例程。移除過程標 題404將接口定義為嘗試從數(shù)據(jù)集合126中移除數(shù)據(jù)元素210的一個或多個例程。查找并 移除過程標題406將接口定義為嘗試查找滿足一個或多個指定準則的數(shù)據(jù)元素210且然后 從數(shù)據(jù)集合126中移除該數(shù)據(jù)元素的一個或多個例程。給定成員資格接口 202可以包括一 個或多個這樣的過程標題。成員資格接口 202的一些實施例包括超時接口 408。超時接口 408可以包括過程 標題400和/或諸如變量等其他項目。如果使用通過過程標題400調(diào)用的例程來修改數(shù)據(jù) 集合成員資格的嘗試比由超時接口 408指定的超時值花費更長的時間,則該修改嘗試被中 斷。數(shù)據(jù)集合內(nèi)容和用于扼流該內(nèi)容的信號量保持不變。可以返回指示超時發(fā)生的結(jié)果 214。在一些實施例中,對于不同的過程標題400,可以指定不同的超時值(包括沒有超時 值)。成員資格接口 202的一些實施例包括完成接口 410。完成接口 410可以包括過程 標題400和/或其他項目,例如標志變量。使用完成接口 410,給定數(shù)據(jù)集合1 或一組給 定數(shù)據(jù)集合126可以被標記為已完成。在一些實施例中,完成接口允許數(shù)據(jù)集合被標記為 永久為空,這指示將不向已完成的數(shù)據(jù)集合1 添加新的數(shù)據(jù)元素210,例如,將永不為該 數(shù)據(jù)集合再次調(diào)用添加過程標題402。結(jié)果,等待將不再出現(xiàn)的數(shù)據(jù)元素210的任何剩余的 移除操作可以被喚醒;數(shù)據(jù)集合126是空的且將不再接收數(shù)據(jù)元素。同樣地,可阻止任何將來的移除操作等待將不再出現(xiàn)的數(shù)據(jù)元素。在一些實施例中,完成接口允許數(shù)據(jù)集合被標 記為永久為滿,這指示將不從已完成的數(shù)據(jù)集合126中移除新的數(shù)據(jù)元素210,例如,將不 再為該數(shù)據(jù)集合調(diào)用移除過程標題404和/或查找并移除過程標題406。結(jié)果,等待將不再 出現(xiàn)的可用空間的任何剩余的添加操作可以被喚醒;數(shù)據(jù)集合126是滿的。同樣地,可以阻 止任何將來的添加操作等待。圖5示出成員資格實現(xiàn)204的可能的過程體500中的某一些,其實現(xiàn)在成員資格 接口 202中所呈現(xiàn)的操作。給定成員資格接口 202可以具有不止一個對應(yīng)的成員資格實 現(xiàn)204,這是因為數(shù)據(jù)集合126的組織結(jié)構(gòu)1 在成員資格接口 202中未被指定,但在成員 資格實現(xiàn)204的例程中是專用的。添加過程體502實現(xiàn)嘗試向數(shù)據(jù)集合1 添加數(shù)據(jù)元素 210的例程。移除過程體504實現(xiàn)嘗試從數(shù)據(jù)集合126中移除數(shù)據(jù)元素210的例程。查找 并移除過程體506實現(xiàn)嘗試查找滿足一個或多個指定準則的數(shù)據(jù)元素210且然后從數(shù)據(jù)集 合1 中移除該數(shù)據(jù)元素的例程。超時實現(xiàn)508同樣實現(xiàn)超時接口 408,且完成實現(xiàn)510同 樣實現(xiàn)完成接口 410。圖6示出阻塞-綁定包裝器206,其在一些實施例中包括可執(zhí)行代碼602和信號 量604、信號量606以提供阻塞-綁定語義。給定實施例可以提供阻塞語義、綁定語義或兩 者。作為對這些信號量的替換或補充,給定實施例可以使用諸如條件變量等不同的扼流機 制來提供阻塞-綁定語義。訪問數(shù)據(jù)元素210的嘗試可以通過與線程安全機制212結(jié)合的 阻塞-綁定包裝器206來管理,如圖6所示。鎖608或其他線程安全機制212不是阻塞-綁 定包裝器206的一部分,但是(如果存在的話)將被內(nèi)置于成員資格實現(xiàn)204中。包裝器 206依賴于由成員資格實現(xiàn)提供的線程安全性并因此不需要鎖608。非線程安全集合1 可以被包裝在實現(xiàn)正確的接口的單個線程安全包裝器中,例 如class NonThreadSafeStack{public void Push (Τ 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 ;}…}給定NonThreadSafeStacH非線程安全棧),仍然可以將其與 BlockingCollection<T> 一起使用,例如private BlockingCollection<T> be =new BlockingCollection<T>(new ThreadSafeStack(new NonThreadSafeStack()));//等等。開發(fā)者可以用線程安全集合來包裝非線程安全集合,以便允許使用阻塞-綁定包 裝器206。如果其中使用此包裝器的通用框架(例如,Microsoft. NET框架或Java框架) 提供表示相關(guān)添加/移除操作的非線程安全版本的接口,則阻塞-綁定包裝器本身可以被 實現(xiàn)為用線程安全集合來包裝提供給它的非線程安全集合,在該情況下,包裝器將內(nèi)部地 使用其自己的鎖來提供線程安全性。至少對于線程而言,諸如信號量604或信號量606等信號量類似于臨界區(qū),不同之 處在于信號量在任一時刻在該區(qū)域允許最多N個線程,而不是在任一時刻只允許一個線程 進入該區(qū)域。N可以是一,在該情況下,信號量可以用于互斥,但是信號量并不一定需要被用 于互斥。信號量可以在阻塞隊列實現(xiàn)中例如用來扼流可以從數(shù)據(jù)集合移除的數(shù)據(jù)元素的 數(shù)量,支持對移除的阻塞。每一次向集合添加元素時,信號量的計數(shù)增加。每一次移除元素 時,信號量的計數(shù)減少。如果曾經(jīng)嘗試減少信號量的計數(shù),且計數(shù)已經(jīng)是零,則操作將阻塞 直到信號量的計數(shù)使得元素能夠被移除,例如直到另一線程出現(xiàn)并增加計數(shù)。一種實現(xiàn)可 以是這樣public void Add (Τ data){lock(_queue)_queue. Enqueue(data);—semaphore. Release ();}public T Remove (){—semaphore. WaitOne ();lock (_queue) return_queue. Dequeue ();}在前述的示例中,信號量用于扼流移除,且鎖用于確保多個線程不同時嘗試修改 (非線程安全)底層集合(queue)。一些實施例允許改為使用任意的線程安全集合,這避免 了內(nèi)部鎖,但仍然使用信號量來扼流。
如圖6所示,阻塞-綁定包裝器206本身可以沒有諸如鎖608、臨界區(qū)或互斥區(qū)等 任何線程安全機制212。S卩,由阻塞-綁定包裝器206提供的扼流能力不同于線程安全機 制。實際上,如在此所描述的,阻塞-綁定包裝器206可以被用于不是多線程并因此不需要 線程安全性的計算機系統(tǒng)。如圖7所示,給定成員資格接口 202可以具有多個對應(yīng)的成員資格實現(xiàn)204,對于 其中的每一個,阻塞-綁定包裝器206提供阻塞-綁定語義。同樣地,可以存在具有多個相 應(yīng)的組織結(jié)構(gòu)128的多個數(shù)據(jù)集合126。通過將那些多個實現(xiàn)置于單個合并實現(xiàn)中且然后 用綁定-阻塞包裝器來包裝該合并實現(xiàn),使得一個綁定-阻塞包裝器206在多個成員資格 實現(xiàn)204周圍是可能的。另選地或另外地,實施例可以是每一個成員資格實現(xiàn)204具有一 個綁定-阻塞包裝器206。為了在多種情況下操作,在包裝器的層面上而不是在實現(xiàn)的層面 上對其進行操作。如圖8所示,連接802可以用于將數(shù)據(jù)流水線806中的過濾器804從數(shù)據(jù)源808 連接到數(shù)據(jù)目的地810。每一個連接802包括包裝在阻塞-綁定包裝器206中的成員資格 實現(xiàn)204。相同的底層數(shù)據(jù)集合1 并不一定用于連接802中的每一個。例如,可以在兩個 過濾器之間使用阻塞棧,而在兩個其他過濾器之間使用阻塞隊列。由于連接802的成員資 格接口 202沒有改變,因此過濾器804不需要關(guān)于在數(shù)據(jù)集合126中使用的實際數(shù)據(jù)結(jié)構(gòu) 的先驗知識,且各自可以通過相同的成員資格接口 202訪問數(shù)據(jù)元素210。一種實施例包括多線程計算機系統(tǒng)102,其中至少一個存儲器112配置有可執(zhí)行 指令116,且至少一個邏輯處理器110被配置成執(zhí)行指令的至少一部分,以便執(zhí)行改變數(shù)據(jù) 集合126中的成員數(shù)據(jù)元素210的數(shù)量的線程安全和阻塞-綁定操作。成員資格接口 202 提供用于訪問數(shù)據(jù)集合的公共線程安全容器接口。成員資格接口 202配置存儲器。成員資 格接口 202被設(shè)計成調(diào)用線程安全操作來改變數(shù)據(jù)集合126中的數(shù)據(jù)元素210的數(shù)量,數(shù) 據(jù)集合1 具有在成員資格接口 202中未指定的組織結(jié)構(gòu)128。在此實施例中,配置存儲器112的成員資格實現(xiàn)204與成員資格接口 202相關(guān)聯(lián)。 成員資格實現(xiàn)204包括實現(xiàn)改變數(shù)據(jù)集合126中的數(shù)據(jù)元素210的數(shù)量的線程安全操作的 指令116。數(shù)據(jù)集合126的組織結(jié)構(gòu)1 在成員資格實現(xiàn)中是專用的,例如,成員資格實現(xiàn) 添加過程體502被定制成向棧添加數(shù)據(jù)元素。在一些實施例中,當調(diào)用構(gòu)造函數(shù)時,成員資 格實現(xiàn)204與成員資格接口 202相關(guān)聯(lián)。阻塞-綁定包裝器206也配置存儲器112并包裝成員資格實現(xiàn)204,即,通過添加 阻塞-綁定語義來補充成員資格實現(xiàn)204。阻塞-綁定包裝器206被配置成響應(yīng)于成員資 格接口 202的過程標題400的調(diào)用而執(zhí)行指令116以執(zhí)行下列的阻塞-綁定操作中的至少 一個當數(shù)據(jù)集合缺乏可供移除的數(shù)據(jù)元素時對從數(shù)據(jù)集合126中移除數(shù)據(jù)元素210的嘗 試執(zhí)行的阻塞操作;當缺乏向數(shù)據(jù)集合126添加數(shù)據(jù)元素210所需要的資源(例如,存儲器 112中足夠的空閑空間)時對向數(shù)據(jù)集合1 添加數(shù)據(jù)元素210的嘗試執(zhí)行的綁定操作。 在一些實施例中,阻塞-綁定包裝器206本身包括扼流信號量,諸如信號量604和/或信號 量606,但是不包含線程安全性鎖608或其他線程安全機制。在一些實施例中,成員資格接口 202包括用于調(diào)用線程安全數(shù)據(jù)集合添加操作的 添加過程標題402,該線程安全數(shù)據(jù)集合添加操作即將接受數(shù)據(jù)元素210、嘗試向數(shù)據(jù)集合 126添加數(shù)據(jù)元素并返回指示添加嘗試的結(jié)果214的狀態(tài)的線程安全操作。在一些實施例中,成員資格接口 202包括用于調(diào)用線程安全數(shù)據(jù)集合移除操作的移除過程標題404,該線 程安全數(shù)據(jù)集合移除操作即將嘗試從數(shù)據(jù)集合1 移除數(shù)據(jù)元素210并至少返回諸如狀態(tài) 碼和/或所移除的數(shù)據(jù)元素210等移除嘗試的結(jié)果214的指示的線程安全操作。在一些實 施例中,成員資格接口 202包括用于調(diào)用線程安全數(shù)據(jù)集合查找并移除操作的查找并移除 過程標題406,該線程安全數(shù)據(jù)集合查找并移除操作即將嘗試在數(shù)據(jù)集合126中查找匹配 至少一個指定數(shù)據(jù)元素準則(例如匹配鍵值或指定的值范圍)的數(shù)據(jù)元素210,將嘗試移除 這樣的數(shù)據(jù)元素(如果找到的話)并將至少返回查找并移除嘗試的結(jié)果214的指示的線程 安全操作。在一些實施例中,成員資格接口 202包括形成超時接口 408的至少一部分的成員 變更超時值。如果嘗試改變數(shù)據(jù)集合的成員(例如,通過添加數(shù)據(jù)元素210)所花費的時間 超過超時值,則阻塞-綁定操作超時并返回失敗指示作為結(jié)果214。在一些實施例中,成員資格接口 202包括形成完成接口 410的至少一部分的完成 值。該系統(tǒng)包括被設(shè)計成注意數(shù)據(jù)集合1 永久為空的指令116和被設(shè)計成然后迅速地喚 醒所有線程120并給予其失敗指示的指令116,否則這些線程將在嘗試從永久為空的數(shù)據(jù) 集合126中移除數(shù)據(jù)元素210時仍然永久地被阻塞。在一些實施例中,系統(tǒng)包括配置存儲器112的多個數(shù)據(jù)集合126。數(shù)據(jù)集合1 可 以共同地展示至少兩個不同的組織結(jié)構(gòu)128(例如,棧和隊列),在這種情況下,可執(zhí)行指令 116可以包括在成員資格實現(xiàn)204和阻塞-綁定包裝器206中的指令,這些指令被設(shè)計成使 用線程安全綁定操作來嘗試向數(shù)據(jù)集合126中的任一個添加數(shù)據(jù)元素210。一些相似的實 施例包括指令116,指令116被設(shè)計成使用線程安全阻塞操作來嘗試從數(shù)據(jù)集合1 中的任 一個中移除數(shù)據(jù)元素210。并不是附圖中示出的每一項都需要存在于每一個實施例中。盡管在此在文本和附 圖中通過具體的示例示出一些可能性,但是各實施例可以背離這些示例。例如,示例的具體 特征可以被忽略、重命名、不同地分組、重復(fù)、不同地用硬件和/或軟件來實例化,或者是兩 個或更多個示例中出現(xiàn)的特征的混合。方法概覽圖9在流程圖900中示出了一些方法實施例。在一給定實施例中,方法的零個或更 多個所示步驟可以被重復(fù),也許具有要操作的不同參數(shù)或數(shù)據(jù)。實施例中的步驟還可以按 與圖中安排的自頂向下的次序不同的次序進行。各步驟可以串行、以部分重疊的方式或完 全并行執(zhí)行。其中遍歷流程圖900以指示在方法期間執(zhí)行的步驟的次序可以隨方法的執(zhí)行 而變化。流程圖遍歷次序還可以隨方法實施例而變化。步驟還可以被忽略、組合、重命名、 重分組或以其他方式背離所示流程,只要所執(zhí)行的方法是可操作的并符合至少一項權(quán)利要 求。在成員資格接口獲取步驟902期間,軟件開發(fā)者(或代表開發(fā)者運作的代碼)獲 取成員資格接口 202。獲取步驟902可通過包括包含實現(xiàn)成員資格接口 202的代碼的文 件、通過鏈接這樣的文件、通過加載這樣的文件、或通過用于將軟件功能引入環(huán)境或特定程 序中的任何機制來完成。開發(fā)者被理解為特定類型的用戶104;終端用戶也被認為是用戶 104。在過程標題獲取步驟904期間,開發(fā)者或環(huán)境獲取過程標題400。過程標題獲取步驟904可以與接口獲取步驟902 —致,但是還應(yīng)理解,通過獲取902成員資格接口 202,在一 些情況下可由此獲取904若干過程標題400。在成員資格實現(xiàn)關(guān)聯(lián)步驟906期間,將成員資格實現(xiàn)204與成員資格接口 202相 關(guān)聯(lián)。關(guān)聯(lián)步驟906可通過實例化類、通過鏈接、通過設(shè)置例程的地址指針或通過用于將過 程體500與過程標題400相關(guān)聯(lián)以使得對過程標題的調(diào)用向過程體傳遞控制(且常常還有 參數(shù))的任何其他機制來完成。在過程體關(guān)聯(lián)步驟908期間,將過程體500與過程標題400相關(guān)聯(lián)。給定過程標 題400可以與系統(tǒng)中的不同的位置處的不同過程體500相關(guān)聯(lián)908。過程體關(guān)聯(lián)步驟908 可以與實現(xiàn)關(guān)聯(lián)步驟906 —致,但是還應(yīng)理解,通過關(guān)聯(lián)906成員資格實現(xiàn)204,在一些情況 下可由此關(guān)聯(lián)908若干過程體500。在包裝步驟910期間,用阻塞-綁定包裝器206來包裝成員資格實現(xiàn)204。包裝步 驟910可通過實例化或用包裝器206的阻塞或綁定例程將成員資格實現(xiàn)204過程體500放 置在調(diào)用鏈中的任何機制來完成。在成員資格接口過程調(diào)用步驟912期間,調(diào)用成員資格接口 202中具有過程標題 400的過程。調(diào)用步驟912可以使用向例程傳遞控制的機制來完成,且可以包括向例程傳遞參數(shù)。在由調(diào)用步驟912引起的移除嘗試步驟914期間,嘗試從數(shù)據(jù)集合126中移除數(shù) 據(jù)元素210。移除哪一元素取決于數(shù)據(jù)集合的實現(xiàn)和當前的內(nèi)容。如果要移除特定元素,則 執(zhí)行查找并移除操作而不是移除操作。移除嘗試步驟914返回被移除的元素(如果元素可 以被移除),且可以返回狀態(tài)碼。嘗試步驟914可以包括調(diào)用成員資格實現(xiàn)204過程體500, 例如移除過程體504或查找并移除過程體506。從數(shù)據(jù)集合移除914并不一定阻塞;執(zhí)行 僅在元素不可供移除移除的情況下阻塞,且在元素可供移除之后繼續(xù)。在阻塞步驟916期間,阻塞操作由阻塞-綁定包裝器206的代碼602來執(zhí)行。例 如,如果沒有可供從數(shù)據(jù)集合126移除的數(shù)據(jù)元素210,例如,因為數(shù)據(jù)集合1 是空的,則 阻塞操作掛起步驟914移除嘗試例程的執(zhí)行。在可由調(diào)用步驟912引起的添加嘗試步驟918期間,嘗試向數(shù)據(jù)集合1 添加數(shù) 據(jù)元素210。嘗試步驟914可以包括調(diào)用成員資格實現(xiàn)204過程體500,例如添加過程體 502。添加918并不總是阻塞執(zhí)行。執(zhí)行阻塞直到集合中存在添加項目的空間;如果已經(jīng)存 在空間,則無需阻塞。在一些實施例中,與向每一個數(shù)據(jù)集合添加數(shù)據(jù)元素的副本相反,向 與成員資格接口相關(guān)聯(lián)的任意數(shù)量的集合中的一個添加單個數(shù)據(jù)元素。在綁定步驟920期間,綁定操作由阻塞-綁定包裝器206的代碼602來執(zhí)行。例 如,如果在數(shù)據(jù)集合1 中沒有大到足以容納數(shù)據(jù)元素210的存儲器空間可用,則綁定操作 掛起步驟918添加嘗試例程的執(zhí)行。在可以由調(diào)用步驟912引起的查找并移除嘗試步驟922期間,嘗試在數(shù)據(jù)集合126 中查找滿意的數(shù)據(jù)元素210,并且如果找到滿意的數(shù)據(jù)元素210就將其移除。零個、一個或 多個數(shù)據(jù)元素210可以是滿意的,這取決于搜索準則、存在的數(shù)據(jù)元素和所討論的實施例 的編碼。嘗試步驟922可以包括調(diào)用成員資格實現(xiàn)204過程體500,例如查找并移除過程體 506。在放置步驟擬4期間,使用腳本、流水線、I/O重定向和/或用于構(gòu)建數(shù)據(jù)流水線的其他機制來將連接802放置在數(shù)據(jù)流水線806中。在導(dǎo)出步驟擬6期間,使用在諸如C-Siarp或Java等編程語言中提供的、通過在 此的教導(dǎo)告知以幫助提供阻塞-綁定語義和/或阻塞-綁定線程安全操作的機制,來導(dǎo)出 數(shù)據(jù)集合類實例。在構(gòu)造函數(shù)定義步驟擬8期間,使用在諸如Clharp或Java等編程語言中提供 的、通過在此的教導(dǎo)告知以幫助提供阻塞-綁定語義和/或阻塞-綁定線程安全操作的機 制,來定義類實例構(gòu)造函數(shù)。在實例構(gòu)造步驟930期間,使用在諸如C#或Java等編程語言中提供的、通過在此 的教導(dǎo)告知以幫助提供阻塞-綁定語義和/或阻塞-綁定線程安全操作的機制,來構(gòu)造類 實例。在實現(xiàn)執(zhí)行步驟932期間,作為調(diào)用步驟912的結(jié)果,在系統(tǒng)中執(zhí)行成員資格實現(xiàn) 204的代碼。在線程安全操作執(zhí)行步驟934期間,例如使用一個或多個成員資格實現(xiàn)過程體 500的線程安全版本來對數(shù)據(jù)集合1 執(zhí)行線程安全操作。示例代碼記住迄今所提供的關(guān)于系統(tǒng)、方法和操作環(huán)境的信息,下面討論用于示例實施例 的程序代碼。實施例不限于在此提供的程序代碼,且給定實施例可以包括另外的程序代碼、 不同的程序代碼、用不同的編程語言編寫的代碼和/或以其他方式背離所提供的示例。對 方法實施例的討論在在示例代碼之后繼續(xù),且回頭參考示例代碼。示例中的代碼幫助為實現(xiàn)成員資格接口 202的任意數(shù)據(jù)集合1 提供阻塞和綁定 支持。在示例中,成員資格接口 202至少支持接受要添加到數(shù)據(jù)集合126的數(shù)據(jù)元素210 并返回指示添加是否成功的結(jié)果214的添加操作。此成員資格接口 202還支持嘗試從數(shù)據(jù) 集合1 移除數(shù)據(jù)元素210并返回指示操作是否成功以及如果成功則返回所移除的數(shù)據(jù)元 素的結(jié)果214的移除操作。在此示例中假設(shè)這兩種操作是線程安全的,這意味著它們支持 使用此接口的多個線程120同時訪問數(shù)據(jù)集合126。在此是用C-Siarp實現(xiàn)的這樣的成員 資格接口 202的示例public interface IConcurrentCollection<T>{Boolean TryAdd(Τ item);Boolean TryRemove(out T item);}即,“IConcurrentCollection<T>. TryAdd(Τ item) ”是過程標題 400 的示例,且具 體地是添加過程標題402的示例。參數(shù)T是數(shù)據(jù)元素210的示例;數(shù)據(jù)類型“item”是用 于數(shù)據(jù)元素210的某種類型。在此代碼中,“IConcurrentCollection<T>TryRemove(out T item) ”是過程標題400的示例,且具體地是移除過程標題404的示例。數(shù)據(jù)集合1 如何實現(xiàn)接口 202和提供線程安全保證的機制的細節(jié)被留給數(shù)據(jù)集 合的實現(xiàn)者。作為示例,順從的線程安全棧可同樣使用dharp,在成員資格實現(xiàn)204中被 如下實現(xiàn)public class ThreadSafeStack<T>
IConcurrentCollection<T>0138]{0139]public bool TryAdd(Τ item){Push(item) ;return0140]true ;}0141]public bool TryRemove(out T item){return TryPop (out0142]item) ;}0143]private void Push (T item){lock (_stack)0144]_stack. Push (item) ;}0145]private bool TryPop (out T item)0146]{0147]item = default (T);0148]lock(_stack)0149]{0150]if (_stack. Count > 0)0151]{0152]item = _stack. Pop ();0153]return true ;0154]}0155]}0156]return false ;0157]}0158]private Stack<T>_stack = new Stack<T>();0159]}即,例程ThreadSafeStack<T>. TryAdd 0,包括用于Push ()的代碼,是過程體 500的示例,且具體地是添加過程體502的示例。同樣地,例程ThreacKafeMackCD. TryRemove (),包括用于TryPop ()的代碼,是移除過程體504的示例。ThreadSafeStack<T>的更高效的實現(xiàn)可以使用節(jié)點的內(nèi)部鏈接列表(其中每一 個節(jié)點都包含一個數(shù)據(jù)元素)和用于操縱那些節(jié)點的互鎖操作來確保線程安全性,從而避 免需要昂貴的鎖。無論如何,這只是IConcurrentCollectionCD的實現(xiàn)的一個示例。在 IConcurrentCollection<T>中,數(shù)據(jù)集合的實現(xiàn)是未被指定的;該實現(xiàn)僅僅需要順從接口 過程標題400以及其他成員資格接口組件,例如超時接口 408和完成接口 410(如果它們存 在的話)。數(shù)據(jù)集合126可以具有集合、隊列、優(yōu)先級隊列和經(jīng)排序的列表的形式或其中阻 塞和綁定語義可以是相關(guān)的任何其他形式的組織結(jié)構(gòu)128。支持阻塞-綁定包裝器206的類型的示例是被稱為BlockingCollectionCD的類 型,BlockingCollectionCD在下面進行討論。BlockingCollectionCD可以在并發(fā)集合 接口的實例周圍提供阻塞和綁定行為。用這樣的實例來初始化BlockingCollectionCD類 型,且BlockingCollectionCD僅知道該實例實現(xiàn)成員資格接口 202且不需要關(guān)于該實例 的內(nèi)容的任何更多的信息。BlockingCollectionCD類型還可以支持來自非空數(shù)據(jù)集合126的初始化,在這種情況下接口 202還可以支持諸如用于在數(shù)據(jù)集合1 中檢索數(shù)據(jù)元素210的計數(shù)的計數(shù) 過程標題400等機制??梢栽诔跏蓟瘯r刻查詢這樣的計數(shù)性質(zhì)。該計數(shù)性質(zhì)應(yīng)與TryAdd/ TryRemove (嘗試添加/嘗試移除)方法保持同步,以使得對TryAdd ()的成功調(diào)用致使計數(shù) 遞增1,對TryRemoveO的成功調(diào)用致使計數(shù)遞減1,且不改變數(shù)據(jù)集合中的數(shù)據(jù)元素的數(shù) 量的調(diào)用也不改變計數(shù)。注意,該構(gòu)造方法方便創(chuàng)建依賴于特定后備存儲的具體類型。例 如,可以用 C-Sharp 創(chuàng)建 BlockingStack<T>,如下public class BlockingStack<T>BlockingColIection<T>{public BlockingStack () :base (newThreadSafeStack<T>()) {}}如前述代碼所示,一個方法實施例包括從諸如BlockingCollectionCD等提供 阻塞-綁定包裝器206的阻塞-綁定類導(dǎo)出擬6集合類,諸如BlockingMackCD。該 方法還包括將用于集合類的構(gòu)造函數(shù)定義928為成員資格實現(xiàn)204類的實例,諸如 Thread&ifeMacKT〉。成員資格實現(xiàn)204類提供實現(xiàn)改變數(shù)據(jù)集合126中的數(shù)據(jù)元素210 的數(shù)量的線程安全操作的過程體500,例如PushO或TryPopO。在許多情況下,導(dǎo)出擬6類和定義擬8構(gòu)造函數(shù)可以是最直接的方法,且還支持異 類流水線等等。然而,存在其他方法。例如,一個實施例可以包裝BlockingCollectionCD 而非從其導(dǎo)出,例如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 ();}}作為另一示例,假設(shè)在創(chuàng)建BlockingCollectionCD的實例時,開發(fā)者把要使用 的底層線程安全集合傳遞到BlockingCollection (阻塞集合),例如var be = new BlockingCollection<int>(new ThreadSafeStack<int> ());前述代碼創(chuàng)建整數(shù)的Threadhf必tack的新實例,且然后立即將其包裝在 BlockingCollection中以便在棧的非阻塞Push/TryPop (進棧/嘗試退棧)能力上提供綁定和阻塞Add/Remove (添加/移除)語義。還可以采用稍微簡單一些的方法。一實施例可 以按照下列實例的各行來創(chuàng)建新類型,而不是使想要阻塞-綁定棧的開發(fā)者創(chuàng)建阻塞集合 并創(chuàng)建線程安全棧class BlockingStack<T>BlockingColIection<T>{public BlockingStackO base (new ThreadSaf eStack<T> ()) {}}現(xiàn)在改為必須編寫var be = new BlockingCollection<int>(new ThreadSafeStack<int>());開發(fā)者可以編寫var be = new BlockingStack<int> ();在諸如BlockingCollectionCD等阻塞-綁定包裝器206的代碼中,可以使用兩 個信號量。一個信號量604表示數(shù)據(jù)集合126中的可供移除的數(shù)據(jù)元素210的計數(shù)(用于 阻塞)。另一信號量606表示可供添加的未分配存儲器空間的量(用于綁定)?,F(xiàn)在參考圖10,繼續(xù)討論BlockingCollectionCD示例。在初始化步驟1002期 間,如果支持非空數(shù)據(jù)集合126,則BlockingCollectionCD代碼向所提供的數(shù)據(jù)集合查詢 其項目計數(shù),并使用該計數(shù)來將可用項信號量604初始化成該值;否則,可用項信號量604 被初始化成當前計數(shù)零。如果強制實施綁定,則可用空間信號量606被初始化成綁定計數(shù); 如果為強制實施綁定,則順從實現(xiàn)具有若干選項,諸如將可用空間信號量606初始化成預(yù) 定最大值(例如ht32. MaxValue),或?qū)τ谒邢嚓P(guān)操作根本不初始化信號量606且然后忽 略之。對BlockingCollectionCD的添加操作可以如下完成。調(diào)用912添加過程標題 402,例如,導(dǎo)致執(zhí)行1004Add/TryAdd(添加/嘗試添加)調(diào)用。在信號量使用步驟1006期 間,如果強制實施綁定,則執(zhí)行等待可用空間信號量606。然后,使用底層接口的添加操作 1008來嘗試數(shù)據(jù)元素添加。如果添加成功,則代碼釋放1010可用項信號量604。如果添加 不成功且如果強制實施綁定,則代碼釋放1012可用空間信號量606。類似地,對BlockingCollectionCD的移除操作可以如下完成。調(diào)用912移除過 程標題404,例如,導(dǎo)致執(zhí)行l(wèi)OHRemove/TryRemove (移除/嘗試移除)調(diào)用。在信號量使 用步驟1016期間,執(zhí)行等待可用項信號量604。然后,使用底層接口的移除操作1018來嘗 試數(shù)據(jù)元素移除。如果移除成功,則代碼釋放1020可用空間信號量606。如果移除不成功, 則不需要釋放可用項信號量604,這是因為移除失敗指示不存在可用數(shù)據(jù)元素。注意,在這些操作中不顯式采用鎖。信號量實現(xiàn)可以在內(nèi)部很好地使用鎖,且集合 實現(xiàn)可以在內(nèi)部使用鎖,但是本發(fā)明的方法對于不使用鎖且改為用無鎖算法實現(xiàn)的數(shù)據(jù)集 合實現(xiàn)也是有用的。因此,一實施例可以提供阻塞和綁定語義的高效實現(xiàn)。盡管如此,在一 些實施例中,鎖用于提供線程安全性。鎖自由度是一些實施例的性質(zhì),在這些實施例中,作為容器(數(shù)據(jù)集合126)為空 的結(jié)果而僅僅發(fā)生等待。相反,通過使用鎖,作為例如多個線程嘗試一次從相同的容器取出的結(jié)果而引入等待。在一些實施例中,兩個線程串行化簡單原子遞增/遞減,且只要在容器 中存在足夠的項目,這兩個線程就可以繼續(xù)而無需獲得更高級的軟件鎖。除了這些基本的添加/移除操作之外,BlockingCollection<T>支持各種選項和 附加操作。例如,添加/移動上可以存在結(jié)合圖4和圖5討論的超時。如果添加或移動操作 的一部分超過預(yù)定時間限制,則相關(guān)信號量可以保持未被修改且其余操作可以被放棄。作為另一示例,可以存在結(jié)合圖4和圖5討論的完成。整個 BlockingCollectionCD可以被標記為已完成和永久為空,這意味著實例的用戶確認將不 添加新的數(shù)據(jù)元素(即,將不再調(diào)用添加)。如果集合不是已經(jīng)為空并阻止任何將來的移 除操作等待,則類型支持喚醒在集合變?yōu)榭諘r等待的任何移除操作。在一些實施例中,當數(shù) 據(jù)集合被標記為完成之后,不允許另外的添加。喚醒所有等待,且不競爭排出容器數(shù)據(jù)集合 的那些等待(如果存在的話)將返回錯誤,因為數(shù)據(jù)集合已變得永久為空;不期望新項目到 達。在一些實施例中,數(shù)據(jù)集合可以類似地被標記為完成和永久為滿。作為又一示例,可以跨越多個BlockingCollectionCD實例執(zhí)行添加/移動操 作。使用例如所展示的 BlockingCollectionCD. TryAddAny 和 BlockingCollectionCD. TryRemoveAny靜態(tài)方法,可以向任意數(shù)量的數(shù)據(jù)集合126中的任一個添加單個數(shù)據(jù)元素 210,或可以從任意數(shù)量的數(shù)據(jù)集合中的任一個移除單個數(shù)據(jù)元素。對于添加操作,這可以 通過進行非減量式等待任何來自所有可獲得的數(shù)據(jù)集合的可用空間信號量可用并嘗試對 該BlockingCollectionCD的非阻塞添加操作來實現(xiàn);如果添加失敗,進程可以重復(fù)直到 成功或直到達到超時。支持用于移除的相似的過程。由于BlockingCollectionCD可以由 任意數(shù)據(jù)集合支持,所以這支持跨異類數(shù)據(jù)結(jié)構(gòu),諸如具有不同組織結(jié)構(gòu)128的數(shù)據(jù)集合 126的添加/移動。在一些實施例中,TryAddAny/TryRemoveAny (嘗試添加任一元素/嘗試移除任一 元素)過程支持向/從任何數(shù)量的分塊-綁定包裝器中的一個添加/移除單個元素。在一 些實施例中,提供支持向一組集合中的每一個集合添加數(shù)據(jù)元素或從該組中的每一個集合 移除元素的過程。例如,一實施例可以提供public bool TryRemoveAny(BlockingCollection [] collections,out T item);public bool TryRemoveAll(BlockingCollection [] collections,out T [] items);調(diào)用者將取回包含來自每一數(shù)據(jù)集合的一個項目的實例的數(shù)組,而不是取回單個 實例。添加/移動的其他變體也是可能的。例如,一實施例可以不限于一次移除一個項目, 而可以改為提供一種方法public T [] Remove (count);S卩,調(diào)用者可以將要移除的數(shù)據(jù)元素的數(shù)量指定為計數(shù)參數(shù),且執(zhí)行將阻塞直到 可以從集合移除該數(shù)量的數(shù)據(jù)元素,此時所請求的數(shù)據(jù)元素將在數(shù)組中返回。由于效率原 因,這可以要求對底層IconcurrentCollection的改變也允許在I^ryAdd/tryRemove (嘗試添加/嘗試移除)的重載中指定多個數(shù)據(jù)元素。多項移除也可以只在包裝器中可能用不同 的語義來實現(xiàn)。附加功能的另一示例涉及流水線化。BlockingCollectionCD可用于連接流水 線806中的過濾器804,且對于連接802中的每一個,不需要使用相同的底層數(shù)據(jù)存儲???以在過濾器一和過濾器二之間使用阻塞棧,同時可以在過濾器二和過濾器三之間使用阻塞 集合。由于接口不改變,因此過濾器不需要關(guān)于支持BlockingCollectionCD的實際數(shù)據(jù) 結(jié)構(gòu)的先驗知識,且可以通過從BlockingCollectionCD展示的相同接口來使用該數(shù)據(jù)結(jié) 構(gòu)。在一些情況下,BlockingCollection<T>添加阻塞和綁定語 義。IConcurrentCollectiorKT〉獲取附加到其的阻塞和綁定語義。然 而,BlockingCollection<T> 本身 可以是 IConcurrentCollection<T>。 IConcurrentCollection<T> 是展示線程安全 TryAdd 和 TryRemove 方法的某一事 物。在不需要在接口 202中指定數(shù)據(jù)集合126的組織結(jié)構(gòu)1 的意義上,那些TryAdd 和TryRemove方法的實際實現(xiàn)是不相關(guān)的。IConcurrentCollection<T>可以是棧, 在此情況下TryAdd實際上是線程安全進棧操作且TryRemove實際上是線程安全退 棧操作?;蛘?,IConcurrentCollection<T>可以是隊列,在此情況下iTryAdd實際上 是線程安全入列操作而TryRemove實際上是線程安全出列操作,等等。在一些場景 中,開發(fā)者可能想要IConcurrentCollection<T>而不關(guān)心實際實現(xiàn)細節(jié),例如棧或 隊列或別的東西是否被用于組織數(shù)據(jù)集合中的數(shù)據(jù)元素。開發(fā)者僅僅需要確保實現(xiàn) 204提供線程安全I^ryAdd/tryRemove方法?,F(xiàn)在,假設(shè)BlockingCollectionCD包裝 IConcurrentCollection<T>并提供其自己的添加綁定和阻塞語義的I^ryAdd/tryRemove 方法。因為BlockingCollectionCD具有線程安全TryAdd/TryRemove方法,所以除了包 裝 IConcurrentCollection<T> 之外,其還滿足其自己是 IConcurrentCollection<T> 的準 則。就面向?qū)ο蠖裕珺lockingCollectionCD 具有 IConcurrentCollection<T> 并且是 IConcurrentCollection<T>。繼續(xù)的方法回頭參考示例代碼,現(xiàn)在繼續(xù)討論方法實施例。一些實施例提供可由軟件開發(fā)者 用來將線程安全數(shù)據(jù)集合與阻塞-綁定語義包裝在一起的方法。該方法包括獲取902成員資格接口 202,由此獲取904過程標題400,諸如 IConcurrentCollection<T>.TryAdd(Τ item)禾口 / 或 IConcurrentCo1Iection<T>. TryRemove (out T item)。成員資格接口 202提供用于調(diào)用912成員資格接口過程來執(zhí)行 改變數(shù)據(jù)集合126中的數(shù)據(jù)元素210的數(shù)量的線程安全操作的至少一個過程標題400。數(shù) 據(jù)集合1 具有未在過程標題中指定的組織結(jié)構(gòu)128(棧、隊列等等)。該方法還包括將成員資格實現(xiàn)204,諸如例程ThreacKafeMackCD. PushO和 ThreadSafeStack<T>. TryPop ()與成員資格接口 202相關(guān)聯(lián)906。該方法由此關(guān)聯(lián)908實 現(xiàn)改變數(shù)據(jù)集合126中的數(shù)據(jù)元素210的數(shù)量的線程安全操作的至少一個過程體500。在 成員資格實現(xiàn)204中數(shù)據(jù)集合126的組織結(jié)構(gòu)1 是專用的,如例如此處的代碼所示。該方法還包括將成員資格接口 202和成員資格實現(xiàn)204包裝在阻塞-綁定包裝器 206,諸如BlockingCollectionCD中。阻塞-綁定包裝器206響應(yīng)于成員資格接口過程的調(diào)用912而執(zhí)行以下操作中的至少一個當數(shù)據(jù)集合缺乏可供移除的數(shù)據(jù)元素時對從數(shù)據(jù) 集合1 移除數(shù)據(jù)元素210的嘗試執(zhí)行的阻塞操作,當缺乏添加數(shù)據(jù)元素所需要的資源,諸 如足夠的空閑存儲器時對向數(shù)據(jù)集合1 添加數(shù)據(jù)元素210的嘗試執(zhí)行的綁定操作。一些方法還包括將第二成員資格實現(xiàn)204與成員資格接口 202相關(guān)聯(lián)906,以及將 第二成員資格實現(xiàn)包裝910在阻塞-綁定包裝器206中。例如,一種方法支持對于兩個數(shù) 據(jù)集合126中的任一個調(diào)用TryRemoveAny ()。在一些實施例中,被包裝在阻塞-綁定包裝 器中的兩個成員資格實現(xiàn)共同實現(xiàn)改變具有彼此不同的組織結(jié)構(gòu)128的兩個數(shù)據(jù)集合1 中的數(shù)據(jù)元素210的數(shù)量的線程安全操作。這兩個數(shù)據(jù)集合可以具有不同的集合類型,諸 如例如棧和隊列,而用于集合126中的數(shù)據(jù)元素210的底層類型是相同的,例如albumjnfo 棧、album_info 隊列。一些方法還包括將第二成員資格實現(xiàn)204包裝910在阻塞-綁定包裝器206的第 二實例中并將這兩個已包裝的成員資格實現(xiàn)放置在數(shù)據(jù)流水線806中。一些方法包括在并行處理環(huán)境中執(zhí)行932阻塞-綁定包裝的成員資格實現(xiàn), 并行處理環(huán)境諸如Microsoft TPL環(huán)境、Microsoft PLINQ環(huán)境或另一并行處理環(huán)境。 Microsoft,TPL和PLINQ是微軟公司的商標。其他方法在未被配置成并行處理的環(huán)境中執(zhí) 行。經(jīng)配置的介質(zhì)一些實施例提供配置有諸如數(shù)據(jù)118和指令116等計算機數(shù)據(jù)和計算機指令的 存儲介質(zhì),該計算機數(shù)據(jù)和計算機指令用于執(zhí)行如上面所討論的提供阻塞-綁定語義的方 法。經(jīng)配置的存儲介質(zhì)可以例如是存儲器112,且具體地可以是可移動存儲介質(zhì)114,諸如 CD、DVD或閃存。在一些實施例中,由經(jīng)配置的介質(zhì)表征的方法可以是例如用于阻塞-綁定數(shù)據(jù)集 合訪問的方法,該方法包括將成員資格實現(xiàn)204與成員資格接口 202相關(guān)聯(lián)906的步驟,該 成員資格實現(xiàn)被設(shè)計成嘗試向數(shù)據(jù)集合126添加數(shù)據(jù)元素210,并嘗試從數(shù)據(jù)集合移除數(shù) 據(jù)元素,該數(shù)據(jù)集合具有在成員資格實現(xiàn)中是專用的且未在成員資格接口中指定的組織結(jié) 構(gòu)128。這些實施例的方法還包括將成員資格接口和成員資格實現(xiàn)包裝910在阻塞-綁定 包裝器206中,包裝器206即響應(yīng)于成員資格接口過程的調(diào)用912而執(zhí)行下列操作中的至 少一個的包裝器當數(shù)據(jù)集合缺乏可供移除的數(shù)據(jù)元素時對從數(shù)據(jù)集合移除數(shù)據(jù)元素的嘗 試執(zhí)行的阻塞操作,當缺乏添加數(shù)據(jù)元素所需要的資源時對向數(shù)據(jù)集合添加數(shù)據(jù)元素的嘗 試執(zhí)行的綁定操作。注意,在這些實施例中,線程安全性是可任選的。而且,在這些實施例 中使用的軟件不一定用使用類繼承的語言來編寫。然而,在一些實施例中,該方法包括執(zhí)行 導(dǎo)出擬6類的指令和執(zhí)行構(gòu)造930類的實例的指令,如以上代碼示例所表示的。在一些實施例中,成員資格實現(xiàn)204執(zhí)行至少某些計算機指令以執(zhí)行934改變數(shù) 據(jù)集合1 中的數(shù)據(jù)元素210的數(shù)量的線程安全操作。例如,其中計算機指令可以執(zhí)行934 下列操作中的至少一個嘗試向一組異類數(shù)據(jù)集合,即并非全都具有相同的組織結(jié)構(gòu)的一 組數(shù)據(jù)集合中的正好一個數(shù)據(jù)集合添加數(shù)據(jù)元素的線程安全操作;嘗試查找且然后從一組 異類數(shù)據(jù)集合中移除數(shù)據(jù)元素的線程安全操作。在一些實施例中,所述方法執(zhí)行將已包裝的成員資格實現(xiàn)的形式的多個連接802 放置在數(shù)據(jù)流水線806中的指令,且這樣做是為了訪問具有不同組織結(jié)構(gòu)128的數(shù)據(jù)集合126。更一般地,在圖9或圖10所示的或在此以其他方式教導(dǎo)的任何方法步驟可以用于 幫助配置存儲介質(zhì),以由此形成經(jīng)配置的介質(zhì)實施例。結(jié)論如在此所描述的,一些實施例提供表示支持對數(shù)據(jù)集合126的并發(fā)添加和移除所 必需的最小線程安全操作集的接口 202。一些實施例包括作為用于此最小接口 202的實現(xiàn) 204的實例的包裝器206來提供的阻塞和綁定語義(用于添加和移除)。一些實施例支持 向和從任意數(shù)量的這些阻塞-綁定集合1 中的任一個添加和移除元素210,這些數(shù)據(jù)集合 相對于底層數(shù)據(jù)組織結(jié)構(gòu)1 而言可以是異類的,例如,可以對阻塞棧、阻塞隊列和阻塞包 進行TryAddAny ()。一些實施例支持流水線806,其中用于在流水線中的過濾器804之間進 行協(xié)調(diào)的阻塞集合126可以是異類的。一些實施例包括公共線程安全容器接口 202。在一 些實施例中,已包裝的實現(xiàn)204形式的新容器使用實現(xiàn)此接口的對象來管理容器存儲中的 數(shù)據(jù)元素210。此新容器提供阻塞(當為空時掛起執(zhí)行)和綁定(當為滿時掛起),但底層 存儲容器不需要知道關(guān)于阻塞或綁定的任務(wù)事物。開發(fā)者在構(gòu)造新容器時通過以實現(xiàn)204 的形式提供用于存儲的種類的具體對象來配置該新容器。給定實施例的其他方面也可以是 值得注意的,這取決于環(huán)境。盡管在此清楚地將特定實施例示出和描述為方法、經(jīng)配置的介質(zhì)或系統(tǒng),但應(yīng)明 白,對一種類型的實施例的討論還一般地擴展到其他實施例類型。例如,結(jié)合圖9和圖10 的方法描述還幫助描述經(jīng)配置的介質(zhì)以及如結(jié)合圖1到圖8描述的那些系統(tǒng)的操作。來自 一個實施例的限制不一定施加于另一個實施例。具體地,各方法不限于在討論系統(tǒng)時呈現(xiàn) 的數(shù)據(jù)結(jié)構(gòu)和安排。在全文中已經(jīng)通過附圖標記來參考附圖。與附圖或文本中的給定附圖標記相關(guān)聯(lián) 的措辭中的任何明顯的不一致性應(yīng)被理解成僅僅是拓寬了標號引用的內(nèi)容的范圍。如此處所使用的,諸如“一”和“該”等術(shù)語包含所指示的項目或步驟中的一個或 多個。具體地,在權(quán)利要求中,對項目的引用一般意味著存在至少一個這樣的項目,且對步 驟的引用意味著執(zhí)行該步驟的至少一個實例。標題僅僅是為了方便;關(guān)于給定主題的信息可以在其標題指示該主題的章節(jié)之外 找到。所提交的所有權(quán)利要求是本說明書的一部分。盡管已經(jīng)在附圖中示出并在上面描述示例性實施例,但本領(lǐng)域的普通技術(shù)人員應(yīng) 明白,可以在不背離權(quán)利要求中所闡述的原理和概念的情況下下做出眾多修改。盡管已經(jīng) 用結(jié)構(gòu)特征和/或方法動作專用的語言描述了本主題,但可以理解,所附權(quán)利要求書中定 義的主題不必限于上述具體特征或動作。在每一個實施例中不一定存在或利用在給定定義 或示例中標識的每一手段和方面。相反,所描述的具體特征和動作是作為供在實現(xiàn)權(quán)利要 求時考慮的示例而公開的。在法律所準許最大范圍內(nèi),落入權(quán)利要求書的等效方案的含義和范圍內(nèi)的所有改 變應(yīng)被權(quán)利要求書的范圍所涵蓋。
權(quán)利要求
1.一種可由軟件開發(fā)者用來將線程安全數(shù)據(jù)集合與阻塞-綁定語義包裝在一起的方 法,所述方法包括以下步驟獲取(90 成員資格接口(20 ,即獲取(904)用于調(diào)用成員資格接口過程來執(zhí)行改變 數(shù)據(jù)集合(126)中的數(shù)據(jù)元素(210)的數(shù)量的線程安全操作的至少一個過程標題000),所 述數(shù)據(jù)集合具有未在所述過程標題中指定的組織結(jié)構(gòu)(1 )將成員資格實現(xiàn)(204)與所述成員資格接口相關(guān)聯(lián)(906),即關(guān)聯(lián)(908)實現(xiàn)改變所述 數(shù)據(jù)集合中的數(shù)據(jù)元素的數(shù)量的線程安全操作的至少一個過程體(500),所述數(shù)據(jù)集合的 組織結(jié)構(gòu)在所述成員資格實現(xiàn)中是專用的;以及將所述成員資格接口和所述成員資格實現(xiàn)包裝(910)在阻塞-綁定包裝器O06)中, 所述包裝器O06)即響應(yīng)于所述成員資格接口過程的調(diào)用而執(zhí)行下列操作中的至少一個 的包裝器在所述數(shù)據(jù)集合缺少可供移除的數(shù)據(jù)元素時對從所述數(shù)據(jù)集合中移除數(shù)據(jù)元素 的嘗試執(zhí)行的阻塞操作(916)在缺少添加所述數(shù)據(jù)元素所需要的資源時對向所述數(shù)據(jù)集 合添加所述數(shù)據(jù)元素的嘗試執(zhí)行的綁定操作(920)。
2.如權(quán)利要求1所述的方法,其特征在于,被包裝在所述阻塞-綁定包裝器O06)中 的兩個成員資格實現(xiàn)(204)共同實現(xiàn)改變具有彼此不同的組織結(jié)構(gòu)(128)的兩個數(shù)據(jù)集合 (126)中的數(shù)據(jù)元素的數(shù)量的線程安全操作。
3.如權(quán)利要求1所述的方法,其特征在于,還包括將第二成員資格實現(xiàn)(204)包裝 (910)在所述阻塞-綁定包裝器(206)的第二實例中,并且將所述兩個已包裝的成員資格實 現(xiàn)放置(924)在數(shù)據(jù)流水線(806)中。
4.如權(quán)利要求1所述的方法,其特征在于,所述方法包括從提供所述阻塞-綁定包裝 器(206)的阻塞-綁定類導(dǎo)出(926)集合類;以及將用于所述集合類的構(gòu)造函數(shù)定義(928) 為提供實現(xiàn)改變所述數(shù)據(jù)集合中的數(shù)據(jù)元素(126)的數(shù)量的線程安全操作的過程體(500) 的實現(xiàn)類的實例。
5.如權(quán)利要求1所述的方法,其特征在于,還包括在并行處理環(huán)境中執(zhí)行(932)阻 塞-綁定包裝的成員資格實現(xiàn)(204)。
6.一個多線程計算機系統(tǒng)(102),包括配置有可執(zhí)行指令(116)的至少一個存儲器(112);至少一個邏輯處理器(110),其被配置成執(zhí)行所述指令的至少一部分以執(zhí)行改變數(shù)據(jù) 集合(126)中的成員的數(shù)量的線程安全和阻塞-綁定操作;成員資格接口(20 ,其配置所述存儲器并被設(shè)計成調(diào)用改變數(shù)據(jù)集合中的數(shù)據(jù)元 素的數(shù)量的線程安全操作,所述數(shù)據(jù)集合具有未在所述成員資格接口中指定的組織結(jié)構(gòu) (128);成員資格實現(xiàn)(204),其配置所述存儲器并且與所述成員資格接口相關(guān)聯(lián),所述成員資 格接口即實現(xiàn)改變所述數(shù)據(jù)集合中的數(shù)據(jù)元素的數(shù)量的線程安全操作的指令(116),所述 數(shù)據(jù)集合的組織結(jié)構(gòu)在所述成員資格實現(xiàn)中是專用的;以及阻塞-綁定包裝器O06),其配置所述存儲器并包裝所述成員資格實現(xiàn),且被配置成執(zhí) 行指令(116)以便響應(yīng)于對所述成員資格接口的調(diào)用而執(zhí)行下列阻塞-綁定操作中的至少 一個將在所述數(shù)據(jù)集合缺少可供移除的數(shù)據(jù)元素時對從所述數(shù)據(jù)集合中移除數(shù)據(jù)元素的 嘗試執(zhí)行的阻塞操作(916),將在缺少添加所述數(shù)據(jù)元素所需要的資源時對向所述數(shù)據(jù)集合添加數(shù)據(jù)元素的嘗試執(zhí)行的綁定操作(920)。
7.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述成員資格接口包括用于調(diào)用線程安全數(shù)據(jù)集合添加操作的添加過程標題G02),所述線程安全數(shù)據(jù)集合 添加操作即將接受數(shù)據(jù)元素,嘗試向所述數(shù)據(jù)集合添加數(shù)據(jù)元素并返回指示所述添加嘗試 的結(jié)果的狀態(tài)的線程安全操作;以及用于調(diào)用線程安全數(shù)據(jù)集合移除操作的移除過程標題G04),所述線程安全數(shù)據(jù)集合 移除操作即將嘗試從數(shù)據(jù)集合中移除數(shù)據(jù)元素并至少返回所述移除嘗試的結(jié)果的指示的 線程安全操作。
8.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述成員資格接口包括用于調(diào)用線程安全 數(shù)據(jù)集合查找并移除操作的查找并移除過程標題G06),所述線程安全數(shù)據(jù)集合查找并移 除操作即將嘗試在數(shù)據(jù)集合中查找匹配至少一個指定數(shù)據(jù)元素準則的數(shù)據(jù)元素,如果找到 則將嘗試移除這樣的數(shù)據(jù)元素并將至少返回所述查找并移除嘗試的結(jié)果的指示的線程安 全操作。
9.如權(quán)利要求6所述的系統(tǒng),其特征在于,還包括成員資格改變超時值(508),由此如 果嘗試改變數(shù)據(jù)集合的成員資格所花費的時間超過所述超時值,則阻塞-綁定操作超時并 返回失敗指示。
10.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述系統(tǒng)包括配置存儲器(112)的多個數(shù) 據(jù)集合(1 ),所述數(shù)據(jù)集合共同展示至少兩種不同的組織結(jié)構(gòu)(1 ),并且所述可執(zhí)行指 令(116)包括以下指令中的至少一個被設(shè)計成使用線程安全綁定操作來嘗試向所述數(shù)據(jù) 集合中的任一個添加數(shù)據(jù)元素的的指令,被設(shè)計成使用線程安全阻塞操作來嘗試從所述數(shù) 據(jù)集合中的任一個中移除數(shù)據(jù)元素的指令。
11.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括用于將所述數(shù)據(jù)集合標記 為已完成的完成接口 G10)。
12.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述阻塞-綁定包裝器(206)本身包括扼 流信號量(604,606)且不包含線程安全鎖。
13.一種存儲介質(zhì)(114),其配置有用于執(zhí)行用于阻塞-綁定數(shù)據(jù)集合訪問的方法的計 算機數(shù)據(jù)(118)和計算機指令(116),所述方法包括下列步驟將成員資格實現(xiàn)(204)與成員資格接口相關(guān)聯(lián)(906),所述成員資格實現(xiàn)被設(shè)計成嘗 試向數(shù)據(jù)集合添加數(shù)據(jù)元素到并嘗試從數(shù)據(jù)集合(126)移除數(shù)據(jù)元素010),所述數(shù)據(jù)集 合具有在所述成員資格實現(xiàn)中專用且未在所述成員資格接口中指定的組織結(jié)構(gòu)(128);以 及將所述成員資格接口和所述成員資格實現(xiàn)包裝(910)在阻塞-綁定包裝器O06)中, 所述阻塞-綁定包裝器(206)即響應(yīng)于對成員資格接口過程的調(diào)用而執(zhí)行下列操作中的至 少一個的包裝器在所述數(shù)據(jù)集合缺少可供移除的數(shù)據(jù)元素時對從數(shù)據(jù)集合移除數(shù)據(jù)元素 的嘗試執(zhí)行的阻塞操作,在缺少添加所述數(shù)據(jù)元素所需要的資源時對向所述數(shù)據(jù)集合添加 數(shù)據(jù)元素的嘗試執(zhí)行的綁定操作。
14.如權(quán)利要求13所述的經(jīng)配置的介質(zhì),其特征在于,所述方法包括執(zhí)行導(dǎo)出(926)類 的指令和執(zhí)行構(gòu)造(930)類的實例的指令。
15.如權(quán)利要求13所述的經(jīng)配置的存儲介質(zhì),其特征在于,所述計算機指令執(zhí)行下列操作中的至少一個嘗試向一組異類數(shù)據(jù)集合,即并非全都具有相同的組織結(jié)構(gòu)的一組數(shù)據(jù)集合中的恰好 一個數(shù)據(jù)集和添加(918)數(shù)據(jù)元素的線程安全操作;嘗試從一組異類數(shù)據(jù)集合中的恰好一個數(shù)據(jù)集合中移除(914)數(shù)據(jù)元素的線程安全 操作;嘗試查找且然后從一組異類數(shù)據(jù)集合中移除(922)數(shù)據(jù)元素的線程安全操作。
全文摘要
成員資格接口提供過程標題以便在不指定數(shù)據(jù)集合的組織結(jié)構(gòu)的情況下添加和移除數(shù)據(jù)集合的元素。與成員資格接口相關(guān)聯(lián)的成員資格實現(xiàn)提供線程安全操作以實現(xiàn)接口過程。成員資格實現(xiàn)上的阻塞-綁定包裝器與線程安全機制分開提供阻塞和綁定支持。
文檔編號G06F9/06GK102047222SQ200980121206
公開日2011年5月4日 申請日期2009年5月1日 優(yōu)先權(quán)日2008年6月2日
發(fā)明者E·阿里, I·奧斯特羅夫斯基, J·達菲, 巴加迪 S·埃爾, S·托布 申請人:微軟公司