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

时间:2012-06-24 01:21:34

标签: c# multithreading locking

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

需要进行何种同步才能确保在调用时按顺序进行写入,并为读取提供最大性能,即如果写入繁忙,则必须在读取之前提供先前的值。

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

据我所知,读取引用类型和值类型应提供原子访问,因此可能不需要锁定?

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

3 个答案:

答案 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)

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

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