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。如果更改项目,您的使用者可能会访问无效数据。