2011-12-08 166 views
0

Google讓我很頭疼這個搜索詞。帶插入優先級的非優先隊列

我需要一個線程安全機制來實現以下功能。 插入優先級高於讀取的線程安全列表。

我需要總是能夠插入一條消息(比方說)到隊列(或其他),偶爾能夠讀取。因此,閱讀,永遠不會干涉插入。

謝謝。

編輯:閱讀也意味着清除紅色部分。

編輯2:也許有用,有一個單一的讀者和一個作家。編輯3:案例場景:每秒插入10次,持續1分鐘(或使用軟件所在硬件的最大可能值)。然後插入1分鐘的暫停。然後在2秒內插入20次插入(或最大可能使用軟件所在的硬件),持續30秒。然後暫停30秒。然後暫停用於最大讀取次數。我不知道我是否足夠清楚。很明顯不是。 (PS:我不知道什麼時候會出現暫停,那就是問題)。最大acc。延遲插入:Enqueue或Add方法完成的時間。

附加:可以使用具有帶TryGetValue和TryRemove的AddOrUpdate的ConcurrentDictionary嗎?

+0

如果沒有限制性約束,該隊列可以在沒有限制和耗盡所有內存的情況下增長,此時插入*必須*失敗或等待。那麼隊列中的消息數量是否有實際的上限或類似? –

+0

@sll你編輯了什麼? (我看,標籤) –

+0

@Damien_The_Unbeliever有,但這裏的重要部分是插入優先級。在身體上,不能在隊列中留下「太多」的消息。 –

回答

1

將您的隊列構建爲對象的鏈接列表。保持對隊列頭部和尾部的引用。請參閱下面的僞代碼,大致講述了主意

QueueEntity Head; 
QueueEntity Tail 

class QueueEntity 
{ 
     QueueEntity Prev; 
     QueueEntity Next; 
     ... //queue content; 
} 

and then do this: 

//Read 
lock(Tail) 
{ 
    //get the content 
    Tail=Tail.Prev; 
} 

//Write 
lock(Head) 
{ 
    newEntity = new QueueEntity(); 
    newEntity.Next = Head ; 
    Head.Prev = newEntity; 
    Head = newEntity; 
} 

在這裏你有閱讀和寫作單獨的鎖,他們將不會彼此阻塞,除非只有一個隊列中的entiry。

+0

聽起來很有趣,會檢查。 –