ReadOnlyCollection(T)的文档指出:
A ReadOnlyCollection(Of T)只要不修改集合,就可以同时支持多个读者.即便如此,通过集合枚举本质上不是一个线程安全的过程.为了在枚举期间保证线程安全,您可以在整个枚举期间锁定集合.要允许多个线程访问集合以进行读写,您必须实现自己的同步.
我的问题是关于粗体部分:
我的问题是,下面包含的类对于单读者单编写器队列类线程安全吗?这种队列称为无锁,即使队列已填满也会阻塞.数据结构的灵感来自Marc Gravell在StackOverflow 上实现的阻塞队列.
结构的要点是允许单个线程将数据写入缓冲区,而另一个线程则读取数据.所有这些都需要尽快发生.
Herb Sutter在DDJ的文章中描述了类似的数据结构,但实现是在C++中.另一个区别是我使用了一个vanilla链表,我使用了一个链表的数组.
我不是仅仅包含一段代码,而是将所有内容与允许的开源许可证(MIT许可证1.0)一起包含,以防任何人发现它有用,并且想要使用它(原样或修改).
这与Stack Overflow上有关如何创建阻塞并发队列的其他问题有关(请参阅在.NET中创建blockinq队列和在.NET中创建线程安全阻塞队列).
这是代码:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;
namespace CollectionSandbox
{
/// This is a single reader / singler writer buffered queue implemented
/// with (almost) no locks. This implementation will block only if filled
/// up. The implementation is a linked-list of arrays.
/// It was inspired by the desire to create a non-blocking version
/// of the …Run Code Online (Sandbox Code Playgroud) 我有一些C#类库,它们的设计没有考虑并发,多线程,锁等等......
代码结构非常好,易于扩展,但它可以从多线程中受益匪浅:它是一组科学/工程库,需要在非常短的时间内执行数十亿次计算(现在它们不会带来好处从可用的核心).
我想将所有这些代码转换为一组多线程库,但我不知道从哪里开始,我没有任何以前的经验.
我可以使用任何可用的帮助,以及任何建议/建议.
我正在处理一个图像处理应用程序,我的主线程上有两个线程:
1 - CameraThread,用于捕获网络摄像头中的图像并将其写入缓冲区
2 - ImageProcessingThread,从该缓冲区获取最新图像进行过滤.
这是多线程的原因是因为速度是至关重要的,我需要让CameraThread继续抓取图片并使ImageProcessingThread在处理上一张图像时准备好接收最新的捕获.
我的问题是找到一种快速且线程安全的方式来访问公共缓冲区,我认为理想情况下,它应该是一个三重缓冲区(图像[3]),这样如果ImageProcessingThread很慢,那么CameraThread可以继续写在另外两个图像上,反之亦然.
什么样的锁定机制最适合这种线程安全?
我查看了锁定语句,但似乎它会使一个线程阻塞 - 等待另一个完成,这将是三重缓冲点.
提前感谢任何想法或建议.
J.