我有一个存储List<Item> dataList
的线程服务器应用程序。有一个写入线程可以修改,添加和删除列表中的项目,以及从该列表中读取的多个线程。
需要进行何种同步才能确保在调用时按顺序进行写入,并为读取提供最大性能,即如果写入繁忙,则必须在读取之前提供先前的值。
我目前使用ReaderWriterLockSlim
来实现它独立的读写锁定功能,但感觉好像有很多昂贵的开销调用ReadLocks是不必要的,因为我想要的只是为了保证写入顺序?
据我所知,读取引用类型和值类型应提供原子访问,因此可能不需要锁定?
性能是一个很大的问题,我的同步结构的优化似乎可以提高很多。
答案 0 :(得分:2)
听起来你有生产者/消费者模式。在.Net 4中,System.Threading.Concurrent
命名空间中有ConcurrentQueue<T> class。您只是在添加和从队列中删除时进行同步。
答案 1 :(得分: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";
答案 2 :(得分:-1)
ReaderWriterLockSlim
,除非有可能因某些重要原因无法进入锁定。Lock(syncObj)
就足够了,只需在读/写操作之前放置锁。如果需要TryEnter
,我们需要查看您的代码。