4

我有一个Queue<T> _q = new Queue<T>();

总是只有一个线程填充它:_q.Enqueue(msg);

总是只有一个线程在使用它:_q.Dequeue();

我想在两个线程中都没有锁。性能很重要,但安全是第一位的。

我需要制作_q一个ConcurrentQueue<T>吗?

UPD 这可能很重要:我不需要确保读取线程会在写入线程入队后立即成功地将项目出队。如果false将采取一些出队 - 没关系。

4

3 回答 3

4

我需要使 _q 成为 ConcurrentQueue

是的。队列不是线程安全的。

于 2013-07-02T08:18:18.640 回答
3

在这里你可以找到一个无锁队列:Lockfreie threadichere Queue - 不要害怕网站是德语的 - 代码应该自己说话。此外,在编写无锁代码:更正的队列中还有另一篇更深入的文章

于 2013-07-02T08:22:18.980 回答
0

您也可以使用syncQueue = Queue.Synchronized(_q);,尽管它在内部使用锁。

于 2013-07-02T08:26:02.827 回答