Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这段代码需要什么样的同步?_C#_Multithreading_Locking - Fatal编程技术网

C# 这段代码需要什么样的同步?

C# 这段代码需要什么样的同步?,c#,multithreading,locking,C#,Multithreading,Locking,我有一个线程服务器应用程序,它存储列表数据列表。有一个修改、添加和删除列表中的项目的写入线程,还有多个从该列表读取的线程 需要什么样的同步来确保写入按调用顺序进行,并为读取提供最大性能,即如果写入繁忙,则读取必须在读取之前提供上一个值 我目前使用的是ReaderWriterLockSlim,因为它具有独立的读写锁定功能,但感觉调用读锁会有很多昂贵的开销,这是不必要的,因为我只想保证按顺序写入 据我所知,读取引用类型和值类型应该提供原子访问,所以锁定可能是不必要的 性能是一个很大的问题,对我的同步

我有一个线程服务器应用程序,它存储
列表数据列表
。有一个修改、添加和删除列表中的项目的写入线程,还有多个从该列表读取的线程

需要什么样的同步来确保写入按调用顺序进行,并为读取提供最大性能,即如果写入繁忙,则读取必须在读取之前提供上一个值

我目前使用的是
ReaderWriterLockSlim
,因为它具有独立的读写锁定功能,但感觉调用读锁会有很多昂贵的开销,这是不必要的,因为我只想保证按顺序写入

据我所知,读取引用类型和值类型应该提供原子访问,所以锁定可能是不必要的


性能是一个很大的问题,对我的同步结构的优化似乎可以提高很多。

如果没有同步,读操作可能会在写操作前后获得部分信息(例如:30%来自旧列表,70%来自新列表)。 如果这不是问题,那么只要有一个编写器,就不需要使用任何同步

如果您的列表包含对象,您可能更喜欢将新数据写入一个新对象,然后将这个新元素与inlist元素交换。 除非有一些我不知道的内部机制,否则更改引用应该是原子的

Object temp = new Object();
temp.value = 5;
temp.name = "whatever";
list[5] = temp;
而不是:

list[5].value = 5;
list[5].name = "whatever";

听起来你有一个生产者/消费者模式。在.NET4中,
System.Threading.Concurrent
名称空间中存在。您仅在添加和从队列中删除时进行同步

ReaderWriterLockSlim
在这里并不真正需要,除非您有可能因为某些重要原因无法进入锁。
一个简单的
锁(syncObj)
就足够了,只需在读/写操作之前放置锁即可。


如果需要
TryEnter
,我们需要查看您的代码。

通过直接方法访问项目属性与使用间接指针没有什么不同。这是一样的,生产者线程仍然可以更改项目的属性。就我所理解的锁而言,这并不理想,因为实际上一次只有一个线程可以读取,因为我们在同一对象上同时锁定读取和写入。是的,您是对的,ReaderWriterLockSlim将为您提供一个很好的解决方案。并发队列不够好,原因1。你没有使用队列,2。如果更改项目,您的使用者可能会访问无效数据。