(C#)-6ren"> (C#)-我有通用的 Queue ( System.Collections.Generic ) 从一个线程进行写入访问。并且必须从另一个线程访问它才能读取。 出于性能原因,我不想进行任何进程同步(包括使用 Co-6ren">
gpt4 book ai didi

c# - 使用运算符 "="线程安全地复制整个 Queue (C#)

转载 作者:太空狗 更新时间:2023-10-29 20:01:44 25 4
gpt4 key购买 nike

我有通用的 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<T>是引用类型。所以分配 queue1queue2只复制引用,不复制队列本身。

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

我相信ConcurrentQueue<T>使用“无锁”编程技术(Interlocked.Exchange 和 friend )并且速度非常快。您应该先对其进行基准测试,然后再将其作为解决方案排除。

复制 Queue<T>肯定会比只使用 ConcurrentQueue<T> 慢.


在我的 2.6GHz 系统上 ConcurrentQueue<object>每秒管理 1500 万入队/出队对,而使用 Queue<object> 每秒管理 4000 万对。 .所以Queue<object>速度大约是原来的三倍。

入队/出队对的 200 个 CPU 周期非常便宜。如果这是瓶颈,请尝试在队列中使用更精细的项目。

关于c# - 使用运算符 "="线程安全地复制整个 Queue<T> (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com