2011-12-20 172 views
12

我正在尋找一個在Delphi中實現的優先級隊列,它可以在多線程環境中很好地工作。東西不是圍繞一個單線程執行鎖定包裝(我已經有)更好Delphi的線程安全優先級隊列?

理想的無鎖的,或專爲多線程插入/刪除。

特殊性在於,在正常操作中,只有在頂級(最高優先級項目)發生更改時纔會添加,刪除和通知,而最高優先級項目的「彈出」操作應該非常少見。

將它用於監視/超時線程監視任務,在其他線程執行,這些任務預計正常終止的大部分時間,所以他們只會被添加/刪除從隊列中。超時線程本質上將等待下一個超時事件,因此在最高優先級事件發生變化時需要通知。

這些任務由腳本處理,可以在任何時候安全地終止。

如果有比這個優先級隊列更好的算法,它們也可能是很好的答案!

編輯:在Martin James發表評論之後,另一個特性是相對較少的不同超時值,並且對於每個超時值,問題都變成了FIFO隊列的問題。

+0

爲什麼「圍繞單線程實現鎖定包裝」對於此任務來說不夠好? – Pol 2011-12-20 08:34:55

+0

使基於鎖的解決方案不合適的性能約束是什麼? – 2011-12-20 08:35:25

+0

@Pol:這還不夠好,因爲我已經有了一個(正如帖子中所說的) – 2011-12-20 08:56:17

回答

0

而不是一個單一的隊列,你可以爲每個優先級使用一個隊列。

的OmnithreadLibrary包含線程安全隊列: http://code.google.com/p/omnithreadlibrary/

http://code.google.com/p/omnithreadlibrary/

+4

多個單優先級隊列並不是真正的解決方案。所有'爆炸'行動都變得非常複雜。 (推動,OTOH,很簡單。)在我的中期計劃中,TODO表示「檢查無鎖優先隊列的可能性」,但這種情況在未來幾個月內不會發生。 – gabr 2011-12-20 12:01:45

1

Julian Bucknall(「德爾福的託姆斯:算法與數據結構」的作者)最近宣佈的EZDSL德爾福XE版本的發佈(一個德爾菲結構圖書館)在他的Blog

不幸的是TThreadsafePriorityQueue(在EZDSLPQu.PAS實現)是基於鎖。

我不禁分享好消息,我的另一目的是讓他在回答問題時貢獻的電話。

+0

我一直使用我自己的個人移植EZDSL,如果我相信任何東西作爲基礎開始,它就是EZDSL。 – 2011-12-20 21:14:31