种族条件如何有用?

时间:2013-12-11 14:43:28

标签: algorithm language-agnostic race-condition

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

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

2 个答案:

答案 0 :(得分:6)

并非所有种族都同样糟糕。

你能得到的最糟糕的种类是阅读部分结果。这就是Herb Sutter referred to作为'看到粉红色的大象':你的程序能够观察到一个违反所有不变量的中间状态。

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

一种不太重要的竞争是当所有数据访问都是原子的时,所以你知道读者只会观察到完全写入的值,但订单是未指定的。因此,您不知道您读取的值是否实际上是最新的,或者您一起读取的两个值是否实际上同时存在于内存中。出于性能原因,接受此通常很有用。这里一个突出的例子是分布式应用程序:通过网络同步数据的速度特别慢,因此通常认为某些节点可能具有过时的世界视图,但仍然能够基于该状态执行工作。想想一个搜索引擎缓存:根据昨天的缓存提供快速结果比提供缓慢结果或根本没有结果更好。

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

答案 1 :(得分:2)

一个这样的情况(至少它可以被认为是一种竞争条件,虽然这个术语在这里可能是有争议的),是线程竞争以多种方式寻找某种解决方案,并且第一次获得可以结束整个算法。见例如 - http://parasail-programming-language.blogspot.co.il/2010/06/intentional-race-condition-in-parasail.html