2011-12-08 128 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

听起来很有趣,会检查。 –