【发布时间】:2012-03-05 02:56:54
【问题描述】:
我有通用的Queue<T> (System.Collections.Generic),可以从一个线程进行写入访问。并且必须从另一个线程访问才能读取。
出于性能原因,我不想进行任何进程同步(包括使用ConcurrentQueue<T>)。所以我想出了将整个队列复制到读取线程中另一个相同类型的队列对象的想法。读取线程中的后续操作将在副本上完成。复制将使用简单的运算符= 完成。
这是一些伪代码:
//Creating main queue
Queue<MyType> queue1 = new Queue<MyType>();
写作主题:
//Perform writing in the main queue
queue1.Enqueue(object);
...
queue1.Dequeue();
阅读线程:
//Copy main queue
Queue<MyType> queue2 = queue1;
//perform all operations in reading thread on queue2
那么这样的解决方案线程安全吗?
UPD:非常感谢,我不知道这只是复制链接。那么有没有办法以线程安全的方式按值复制整个对象?
【问题讨论】:
-
只有在将队列发布到另一个线程后不更改队列时,它才是线程安全的。
-
通常,
Queue用于生产者/消费者场景。即,一个线程写入它,另一个线程从中读取。每次都复制它没有多大意义(您可以使用任何集合类型,并且它的工作方式相同)。您应该使用单个共享队列并在出列单个项目时立即将其锁定,或者使用ConcurrentQueue,如下所述。
标签: c# collections thread-safety