我有通用的Queue<T>
(System.Collections.Generic
),它是从一个线程写入访问。它必须从另一个线程访问以供阅读。复制整个队列<T>与运算符“=”线程安全(C#)
出于性能原因,我不想进行任何进程同步(其中包括使用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:非常感谢,我不知道这只是复制链接。那么有没有办法按照线程安全的方式通过值复制整个对象?
只有在您将其发布到另一个线程后不更改队列时,它才是线程安全的。 – Steven 2012-02-13 17:39:07
通常,“Queue”意味着在生产者/消费者场景中使用。也就是说,一个线程写入它,另一个线程读取它。每次复制它都没有什么意义(您可以使用任何集合类型,并且它将工作相同)。您应该使用单个共享队列并在您离队单个项目时很快将其锁定,或者使用下面所述的'ConcurrentQueue'。 – Groo 2012-02-13 18:38:33