簡體   English   中英

線程安全緩沖的可觀察優先級隊列?

[英]Thread-Safe Buffered Observable Priority Queue?

我正在編寫一個程序,其中一個線程需要將項目推送到隊列中,並且一個或多個線程將項目從隊列中彈出並處理它們。 為了避免內存不足,我希望生產者線程在隊列變滿時休眠。 有些項目的優先級高於其他項目,所以我希望首先處理這些項目。 如果項目具有相同的優先級,我希望首先添加的項目首先被處理。

我想在WPF DataGrid中顯示前100個項目,因此它也需要由UI線程訪問。 如果它可以通知UI線程也有更新,即實現IObservable,那將會很好。

是否有容器類可以完成所有這些操作?

對於獎勵積分,我很確定在排隊和出隊時都不需要鎖定整個隊列。

.NET 4實現很好。

你運氣不好尋找容器 - 你必須自己實施一個容器。 小心優先級 - 排序速度很慢。 我所做的是我自己實現了一個隊列類,內部使用多個數組(每個優先級一個 - 編碼低,中,高)。 這樣我從不排序。 如果可以,請避免使用鎖(假設為多核)並使用自旋鎖(.NET 4.0),它們在隊列方案中更快/更少開銷。

如果您使用的是.NET 4,則應該認真考慮使用自定義調度程序的任務並行庫 ,例如QueuedTaskScheduler示例。 我不確定它是否滿足您的所有要求,但這將是一個良好的開端。

我過去所做的是將多個ConcurrentQueue<T>集合包裝成一個 - 這是TomTom所建議的 當您打算擁有的優先級數量很少時,這是非常合理的。 例如,在某些情況下,甚至可能有兩個:高和低。 然后你的TryDequeue方法看起來像這樣:

public bool TryDequeue(out T item)
{
    return _highItems.TryDequeue(out item) || _lowItems.TryDequeue(out item);
}

這不是您問題的全面答案,但也許它可以幫助您入門。

暫無
暫無

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

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