c# - 内存锁以确保共享数据可以被多个线程读取,但只能由一个线程写入?

标签 c# multithreading list thread-safety shared-memory

我正在尝试编写一个 C# 程序,其中列表 A 中的值与线程中的特定值 x 进行检查。我希望线程将其 x 值与列表中的每个值进行比较,如果未找到,我希望它们将其值 x 添加到A。然后,线程将从其私有(private)内存中的列表中获取新的x,并开始再次将其与A中的值进行比较。该程序的目标是使A成为唯一值的列表,并包含线程中列表的所有值。

我想知道 C# 是否有一些 native 读/写锁,允许尽可能多的线程从单个列表中读取数据,但是一旦一个线程开始写入,我希望所有其他线程在尝试之前都等待再次从列表中读取。

此外,有没有办法确保多个线程不会尝试同时写入?如果 2 个以上的线程包含相同的 x 值并尝试同时获取写锁,然后将相同的值相继添加到列表中,我可以看到这是一个问题。

最佳答案

I'm wondering if C# has some native read/write lock that will allow as many threads to read from a single list as possible

是的,使用 Reader Writer Lock 。这就是它的设计目的。

.net 中有两个版本的 ReaderWriterLock,分别是 ReaderWriterLockReaderWriterLockSlim。后者是首选,因为它很有效。

关于c# - 内存锁以确保共享数据可以被多个线程读取,但只能由一个线程写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33846013/

相关文章:

c# - C# 8.0 是否支持 IAsyncEnumerable?

c# - WPF 弹出控件 - 查找 X、Y 坐标

c++ - 如何在阻塞调用周围实现定时等待?

python - python中的快速数据比较

c# - 通过 C# 递归通知子控件

c# - 在特定的 hwnd(窗口句柄)下更改光标?

java - 线程中的方法调用给出 "Can' t 在线程内创建处理程序“异常

multithreading - Julia - 读取大文件的并行性

python - 列出 __iadd__、+= 和返回值

python - Python 中的字典列表