我有Queue<T> _q = new Queue<T>();
总是只有一个线程填充它:_q.Enqueue(msg);
总有一个线程消耗它:_q.Dequeue();
我想在两个线程中都无锁。表现很重要,但首先是安全。
我是否需要_q
ConcurrentQueue<T>
?
UPD
这可能很重要:
在编写线程后,我不需要确定读取线程是否会立即成功地使项目出列。如果将采取一些false
出列 - 那没关系。
答案 0 :(得分:4)
我是否需要将_q作为ConcurrentQueue
是。队列不是线程安全的。
答案 1 :(得分:3)
在这里你可以找到一个无锁的队列:Lockfreie threadsichere Queue - 不要害怕网站是德语 - 代码应该说明一切。此外,Writing Lock-Free Code: A Corrected Queue
还有另一篇更深入的文章答案 2 :(得分:0)
你也可以使用syncQueue = Queue.Synchronized(_q);
,虽然它在内部使用锁。