内存锁以确保共享数据可以被多个线程读取,但只能由一个线程写入?
Memory lock to ensure shared data can be read from by many threads, but only written to by one?
我正在尝试编写一个 C# 程序,其中列表 A 中的值根据线程中的特定值 x 检查。我希望线程将它们的 x 值与列表中的每个值进行比较,如果找不到,我希望它们添加它们的值 x 到 A。然后该线程将从其私有内存中的列表中获取一个新的 x,并再次将其与 A 中的值进行比较。这个程序的objective就是让A成为一个唯一值的列表,并在线程中包含所有列表的值。
我想知道 C# 是否有一些本机 read/write 锁,允许尽可能多的线程从单个列表中读取,但是一旦一个开始写入,我希望所有其他线程在尝试再次从列表中读取之前等待。
此外,有没有一种方法可以确保多个线程不会同时尝试写入?如果 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有两个版本,分别是ReaderWriterLock
和ReaderWriterLockSlim
。推荐后者,效率高
我正在尝试编写一个 C# 程序,其中列表 A 中的值根据线程中的特定值 x 检查。我希望线程将它们的 x 值与列表中的每个值进行比较,如果找不到,我希望它们添加它们的值 x 到 A。然后该线程将从其私有内存中的列表中获取一个新的 x,并再次将其与 A 中的值进行比较。这个程序的objective就是让A成为一个唯一值的列表,并在线程中包含所有列表的值。
我想知道 C# 是否有一些本机 read/write 锁,允许尽可能多的线程从单个列表中读取,但是一旦一个开始写入,我希望所有其他线程在尝试再次从列表中读取之前等待。
此外,有没有一种方法可以确保多个线程不会同时尝试写入?如果 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有两个版本,分别是ReaderWriterLock
和ReaderWriterLockSlim
。推荐后者,效率高