簡體   English   中英

C#中的無鎖優先隊列

[英]A lock-free priority queue in C#

我最近一直在尋找有關如何在 C# 中構建無鎖優先級隊列的信息。 我什至還沒有找到任何語言的實現,或者關於這個問題的像樣的論文。 我發現幾篇論文似乎是副本,或者至少引用了一篇特定的論文,盡管它的名字實際上並不是關於無鎖優先隊列的論文; 它實際上是一篇關於使用細粒度鎖的優先級隊列的論文。

我從其他地方收到的答復包括“使用單個線程”和“您不需要它是無鎖的”和“這是不可能的”。 這三個回答都是錯誤的。

如果有人有這方面的信息,我將不勝感激。

一般來說, 自己編寫這種代碼是一個壞主意

但是,如果您真的想編寫這種代碼,我說從Eric Lippert 的書(或博客,實際上) (網絡存檔鏈接)中獲取一頁,基本上,您將實現隊列,而不是擁有所有對隊列進行修改的函數會修改您調用該方法的實例,這些方法返回隊列的全新實例

這在語義上類似於System.String用於維護不變性的模式; 所有操作都返回一個新的System.String ,原始未修改。

這樣做的結果是您被迫重新分配每次調用時返回的引用。 因為引用的賦值是原子操作,所以不用擔心線程安全; 你保證讀/寫將是原子的。

然而,這將導致最后勝利的局面; 可能對隊列進行了多次修改,但只有最后一個分配會保留,而丟失了其他插入隊列的內容。

這可能是可以接受的; 如果沒有,您必須在引用的分配和讀取周圍使用同步。 您仍然會有一個無鎖優先級隊列,但是如果您擔心線程安全和維護操作的完整性,那么您除了將同步的關注移到數據結構之外(幾乎所有情況下) , 是一件好事,因為它為您提供了細粒度的顯式控制)。

多處理器編程的藝術 請參閱第 15 章 - 優先級隊列。 本書使用 Java 編寫,但可以輕松轉換為 C#,因為它們都具有 GC(這對於本書中的大多數實現很重要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM