2013-12-11 53 views
10

One of the answers到什么竞争条件被提及的低级算法故意使用竞争条件的问题。竞赛条件如何有益?竞赛条件如何有用?

编辑:并发和队列是故意不关心事物排序的好例子,只要没有丢失。任何想法如何“真正毛茸茸的低级算法这样做的目的”

+0

在问的时候,没有足够的声望评论提到的答案。现在评论。也许作者会注意到。 –

+0

我认为他的观点并不是竞争条件是有用的,而是它不是灾难性的。 –

+3

谷歌搜索“故意竞争条件”给出了一些似乎相关的链接。 –

回答

2

一个这样的情况下(至少它可以被看作是一种竞争状态,尽管它可能是值得商榷的,如果这里的长期持有),是当线程查找在多个方面的一些解决方案的竞争,并率先到那里可以结束整个算法。参见例如 - http://parasail-programming-language.blogspot.co.il/2010/06/intentional-race-condition-in-parasail.html

+1

我不认为“竞赛条件”一词适用于这一个。从两条路径得出结论并不会产生冲突情景,而是产生条件或决策情景。这就是说,谢谢你介绍这个博客。有趣的阅​​读。 – Xephon

+0

@AlexV。场景的细节? – Xephon

+0

@Xephon,我倾向于同意,但作者显然不那么值得讨论。 – Leeor

6

并非所有的比赛都同样糟糕。

最坏的一种比赛,你可以得到在读的部分结果。这就是Herb Sutter referred to作为“看粉红大象”:你的程序能够观察到一个违反所有不变量的中间状态。

这里最典型的例子是并发的非原子写入。如果一个线程从一个由另一个线程同时写入的变量读取,读者可能会获得完整的垃圾。您不仅可以分辨读者是否会看到旧值或新值,它可能实际上看到任何人从未写过的值。这些类型的数据竞赛需要不惜一切代价来避免,因为以任何方式推断观察值几乎是不可能的。例如C++在这种情况下直接发送给undefined-behavior-land。

一个不太重要的一种比赛的是,当所有的数据访问是原子的,所以你知道读者仅会看到完全写入值,但顺序是不确定的。所以你不知道你读的价值是否是最新的,或者你读的两个价值是否同时在内存中。出于性能原因接受这种做法通常很有用。一个突出的例子是分布式应用程序:通过网络同步数据特别慢,所以人们经常接受某些节点可能对世界有过时的看法,但仍然能够根据该状态执行工作。考虑一下搜索引擎缓存:最好根据昨天的缓存给出一个快速结果,而不是给出一个缓慢的结果或根本没有结果。

类似的例子发生在非分布式环境。考虑一个无锁队列:您通常不关心项目在队列中的确切顺序。所有生产者将种子插入到队列后面,并且类似地,所有消费者的种族都要消耗队列中的前端项目。但是,只要您可以保证没有任何物品意外丢失或损坏,这种降低的控制水平是可以接受的。