我有一个Queue<T> _q = new Queue<T>();
总是只有一个线程填充它:_q.Enqueue(msg);
总是只有一个线程在使用它:_q.Dequeue();
我想在两个线程中都没有锁。性能很重要,但安全是第一位的。
我需要制作_q
一个ConcurrentQueue<T>
吗?
UPD
这可能很重要:我不需要确保读取线程会在写入线程入队后立即成功地将项目出队。如果false
将采取一些出队 - 没关系。
我有一个Queue<T> _q = new Queue<T>();
总是只有一个线程填充它:_q.Enqueue(msg);
总是只有一个线程在使用它:_q.Dequeue();
我想在两个线程中都没有锁。性能很重要,但安全是第一位的。
我需要制作_q
一个ConcurrentQueue<T>
吗?
UPD
这可能很重要:我不需要确保读取线程会在写入线程入队后立即成功地将项目出队。如果false
将采取一些出队 - 没关系。
我需要使 _q 成为 ConcurrentQueue
是的。队列不是线程安全的。
在这里你可以找到一个无锁队列:Lockfreie threadichere Queue - 不要害怕网站是德语的 - 代码应该自己说话。此外,在编写无锁代码:更正的队列中还有另一篇更深入的文章
您也可以使用syncQueue = Queue.Synchronized(_q);
,尽管它在内部使用锁。