3

我有一个线程服务器应用程序存储List<Item> dataList. 有一个写入线程可以修改、添加和删除列表中的项目,并且有多个线程从这个列表中读取。

需要什么样的同步来确保写入按调用顺序发生并为读取提供最大性能,即如果写入繁忙,读取必须只提供读取之前的先前值。

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

据我了解,阅读引用类型和值类型应该提供原子访问,因此可能不需要锁定?

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

4

3 回答 3

2

听起来你有一个生产者/消费者模式。在 .Net 4 中,命名空间中有ConcurrentQueue<T> 类System.Threading.Concurrent。您仅在从队列中添加和删除时进行同步。

于 2012-06-24T09:56:48.337 回答
0

如果没有同步,读取操作可能会从写入操作之前和之后获取部分信息(例如:旧列表中的 30% 和新列表中的 70%)。如果这不是问题,那么只要有一个写入器,您就不需要使用任何同步。

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

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

代替:

list[5].value = 5;
list[5].name = "whatever";
于 2012-06-24T01:43:27.173 回答
-1

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

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

于 2012-06-24T10:15:09.523 回答