Ale*_* V. 10 language-agnostic algorithm race-condition
关于什么竞争条件的问题的答案之一被提到故意使用竞争条件的低级算法.种族条件如何有益?
编辑:并发和队列是故意不关心事物排序的一个很好的例子,只要没有丢失.关于"真正多毛的低级算法如何故意这样做"的任何想法?
并非所有种族都同样糟糕.
你能得到的最糟糕的种族是阅读部分结果.这就是Herb Sutter 所说的 "看到粉红色的大象":你的程序能够观察到一个违反所有不变量的中间状态.
这里的典型示例是并发非原子写入.如果一个线程从另一个线程同时写入的变量读取,则读者可能获得完全垃圾.您不仅无法判断读者是否会看到旧值或新值,它实际上可能会看到任何人从未写过的值.需要不惜一切代价避免这些类型的数据竞争,因为几乎不可能以任何方式推断观察到的值.例如,在这种情况下,C++会直接发送给undefined-behavior-land.
一种不太重要的竞争是当所有数据访问都是原子的时,所以你知道读者只会观察到完全写入的值,但订单是未指定的.因此,您不知道您读取的值是否实际上是最新的,或者您一起读取的两个值是否实际上同时存在于内存中.出于性能原因,接受此通常很有用.这里一个突出的例子是分布式应用程序:通过网络同步数据的速度特别慢,因此通常认为某些节点可能具有过时的世界视图,但仍然能够基于该状态执行工作.想想搜索引擎缓存:最好根据昨天的缓存提供快速结果,而不是给出缓慢的结果或根本没有结果.
类似的例子发生在非分布式环境中.考虑一个无锁队列:您通常不关心项目最终在队列中的顺序.所有生产者都"竞争"将项目插入队列的后面,同样所有消费者"竞争"以消耗队列的前面项目.但是,只要您能保证没有物品意外丢失或损坏,这种降低的控制水平是可以接受的.
一种这样的情况(至少它可以被认为是竞争条件,尽管如果该术语在这里成立可能是有争议的),是当线程以多种方式竞争寻找某种解决方案时,第一个到达那里的可以结束整个算法。参见例如 - http://parasail-programming-language.blogspot.co.il/2010/06/intentional-race-condition-in-parasail.html