2012-06-24 45 views
3

我有一个线程服务器应用程序,存储List<Item> dataList。有一个写入线程可以修改,添加和删除列表中的项目,以及从该列表读取的多个线程。这段代码需要什么样的同步?

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

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

据我了解,阅读引用类型和值类型应提供原子访问,所以锁定可能没有必要?

性能是一个大问题,它似乎像我同步结构可以通过颇有几分改进的优化。

回答

2

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

0

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

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

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

代替:

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

访问经由直接的方法的项属性不大于使用间接指针不同。同样的事情,生产者线程仍然可以改变项目的属性。 –

-1

ReaderWriterLockSlim在这里并不是真的需要,除非有机会因为某些重要原因而无法进入锁定。
一个简单Lock(syncObj)就足够了,只是锁定到位之前读/写操作。

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

+0

就理解锁而言,这并不理想,因为基本上只有一个线程可以一次读取,因为我们锁定了同一对象上的读取和写入。 – Vort3x

+0

是的,你是正确的,ReaderWriterLockSlim会给你一个很好的解决方案。并发队列不够好,导致1.您没有使用队列,2.如果更改项目,您的客户可能会访问无效数据。 –