我注意到,你可以打电话的队列。同步,以获得一个线程安全的队列中的对象,但是同样的方法不是提供在排队<T>.任何人都不会知道为什么吗?似乎有点怪异。

有帮助吗?

解决方案

更新 -在.净4,现在是 ConcurrentQueue<T> 在系统。集合。并行,作为文件记录在这里 http://msdn.microsoft.com/en-us/library/dd267265.aspx.它是有趣的注意到,其IsSynchronized方法(正)的回报是假的。

ConcurrentQueue<T> 是一个完整地了改写,创造副本的队列中一一列举,并使用先进的无锁定技术一样 Interlocked.CompareExchange()Thread.SpinWait().

剩下的这个答复仍然是相关的,因为它涉及死亡的老同步()和SyncRoot成员,以及为什么他们没有工作非常好,从API的观点。


为每Zooba的评论,BCL队的决定,太多的开发人员被误解的目的同步(以及在较小程度上,SyncRoot)

布莱恩Grunkemeyer描述这在BCL队的博客了几年后:http://blogs.msdn.com/bclteam/archive/2005/03/15/396399.aspx

关键问题是获得正确的粒度周围锁,其中一些开发商会天真地使用多个性质或方法上的"同步"收集和认为他们的代码线的安全。布赖恩*使用排队作为他的实例中,

if (queue.Count > 0) {
    object obj = null;
    try {
        obj = queue.Dequeue();

开发人员就不会实现,可以改变的另一个线程之前出列是援引。

强制开发人员使用一个明确的锁声明周围的整个操作意味着防止这种虚假的安全感。

因为布莱恩提到,去除SyncRoot部分是因为它主要是介绍,以支持同步的,但也因为在许多情况下有一个更好的选择锁定对象的大部分时,队列中的实例本身,或

private static object lockObjForQueueOperations = new object();

在这类拥有的实例,排队...

这后一种方法通常是最安全的,因为它避免了其他一些共同的陷阱:

正如他们所说的, 线是很难的, ,并使它看起来很容易可能是危险的。

其他提示

你可能会发现并行CTP值得一试;这是一个博客文章,来自那些把它放在一起非常热门的人:

枚举并发收藏

这不是一回事,但它可能会解决你更大的问题。 (他们甚至使用Queue<T>ConcurrentQueue<T>作为他们的榜样。)

现在有一个,在.Net 4.0中:

ConcurrentQueue<T> 
System.Collections.Concurrent中的

http://msdn.microsoft.com/en-us/library/ dd267265.aspx

(我假设你的意思是队列<!> lt; T <!> gt;对于第二个。)

除了从ICollection接口继承IsSynchronized和SyncRoot属性(但不显式是Synchronize())之外,我无法专门回答这个问题。没有一个通用集合使用它和ICollection <!> lt; T <!> gt;界面不包括SyncRoot。

至于为什么不包括它,我只能推测它们没有按照图书馆设计者的预期方式使用,或者它们根本没有被足够的用来证明在新的集合中保留它们。 / p>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top