使用运算符"="线程安全复制整个Queue <T>(C#)

Iva*_*nov 7 c# collections thread-safety

我有从一个线程写入的generic Queue<T>(System.Collections.Generic).并且必须从另一个线程访问它以进行读取.

ConcurrentQueue<T>出于性能原因,我不想进行任何进程同步(包括使用).所以我想出了将整个队列复制到阅读线程中相同类型的另一个队列对象的想法.阅读线程中的后续操作将在副本上完成.复制将通过简单的操作员完成=.

这是一些伪代码:

//Creating main queue
Queue<MyType> queue1 = new Queue<MyType>();
Run Code Online (Sandbox Code Playgroud)

写线程:

//Perform writing in the main queue
queue1.Enqueue(object);
...
queue1.Dequeue();
Run Code Online (Sandbox Code Playgroud)

阅读帖子:

//Copy main queue 
Queue<MyType> queue2 = queue1;
//perform all operations in reading thread on queue2
Run Code Online (Sandbox Code Playgroud)

这样的解决方案线程安全吗?

UPD:非常感谢,我不知道这只是复制链接.那么有没有办法以线程安全的方式按值复制整个对象?

Cod*_*aos 11

Queue<T>是一种参考类型.所以分配queue1queue2不只是复制参考,不排队本身.

赋值本身是原子的,因此是线程安全的.queue1在一个线程中访问,在另一个线程queue2中访问queue1并不比从两个线程访问更安全.即它不安全.

我相信ConcurrentQueue<T>使用"无锁"编程技术(Interlocked.Exchange和朋友)并且非常快.在排除它作为解决方案之前,您应首先对其进行基准测试.

复制一个Queue<T>肯定会慢于使用ConcurrentQueue<T>.


在我的2.6GHz系统上,ConcurrentQueue<object>每秒管理着1500万个入队/出队对,相比之下,有4000万Queue<object>.所以Queue<object>大约快三倍.

enqueue/dequeue对的200个CPU周期非常便宜.如果这是瓶颈,请尝试在队列中使用更细粒度的项目.