2016-12-13 110 views
0

我對std :: atomic :: compare_exchange_weak的虛假故障感到困惑。如果值等於預期,std :: atomic :: compare_exchange_weak的虛假故障

  1. 如果原子變量的值是預期的值,可以compare_exchange_weak失敗嗎?
  2. 如果答案是肯定的:有沒有辦法知道這個值是否是預期值?因爲我的代碼假設如果CAS失敗,那麼該值不是預期的值。
  3. 特別是,即使在虛假故障的情況下,compare_exchange_weak是否會將「expected」參數設置爲當前值?在這種情況下,這個值可能是預期值(如果CAS由於某些時間問題而失敗......)或者不是?

編輯:澄清第三點:我沒有提到通過CAS改變變量值本身,而是改變了「預期」的說法參考。問題是compare_exchange_weak是否將此引用更改爲變量的當前值 - 通常都是這樣,特別是在出現虛假故障的情況下。我問這是因爲我的代碼假設在CAS之後,'expected'參數保存了當前值。 (根據我對第二個問題的回答,我認爲答案是「預期」的論點從來沒有在弱版本中更新過,正確嗎?)

回答

1

1)是的。這是虛假失敗的定義:即使真實價值與實際價值不相等,它的行爲也是如此。

2)如果您必須知道或確保不發生虛假故障,請使用compare_exchange_strong。 3)不,不。不。這將違反合同:只有real == expected寫的,但它會載入價值expected,即使是同一個:

N3797
[atomics.types.operations.req]/25

備註:弱比較交換操作可能會虛假地失敗。也就是說,即使當期望和對象引用的內存內容相同時,它也可能返回false並將其存儲回原先存在的相同內存內容。

+0

@galym新增標準報價 –

+0

謝謝。但它仍然沒有完全解決我的問題,因爲它只涉及預期和客體相等的情況,並且因爲它陳述「可能」,這聽起來不是保證。是否無法保證期望的引用是否通過compare_weak_exchange設置爲原子變量的當前值? – galym

+0

@galym有三種可能的結果。 *「good」*:'expected' =='object'。將'desired'的值存儲到'object'中,'expected'沒有改變,但是它無關緊要,因爲它無論如何都等於object。 *「bad」*:'expected'!='object'。將真實的「對象」值加載到「預期」中。 *「虛假失敗」*:'預計'=='對象'。它仍然可以工作,就好像它是'壞'的情況:將真實的'object'值加載到'expected'中(實際上它不會像預期的那樣改變它等於object) –

4

微弱的交換功能可能無法更新,以便有更高性能的實現。他們傾向於在循環檢查中使用,因爲它會在下一次循環迭代時得到它。

因此,具體的答案...

  1. 是,故障是,它可能無法更新,如果值== expected_value。
  2. 如果您確實需要以可靠的方式知道,請不要使用這些功能的弱版本。改爲強壯的。
  3. 不,它不會覆蓋該值,如果它不是預期值。
+0

能否請您參考我對第三個問題的解釋?謝謝! – galym