2013-12-11 47 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。

一個不太重要的一種比賽的是,當所有的數據訪問是原子的,所以你知道讀者僅會看到完全寫入值,但順序是不確定的。所以你不知道你讀的價值是否是最新的,或者你讀的兩個價值是否同時在內存中。出於性能原因接受這種做法通常很有用。一個突出的例子是分佈式應用程序:通過網絡同步數據特別慢,所以人們經常接受某些節點可能對世界有過時的看法,但仍然能夠根據該狀態執行工作。考慮一下搜索引擎緩存:最好根據昨天的緩存給出一個快速結果,而不是給出一個緩慢的結果或根本沒有結果。

類似的例子發生在非分佈式環境。考慮一個無鎖隊列:您通常不關心項目在隊列中的確切順序。所有生產者將種子插入到隊列後面,並且類似地,所有消費者的種族都要消耗隊列中的前端項目。但是,只要您可以保證沒有任何物品意外丟失或損壞,這種降低的控制水平是可以接受的。