天天看點

對 Data Race Free 的了解

Data Race Free 的動機

Data Race Free 是對多線程程式 同步程度 的一種描述,假如你的多線程程式的同步程度滿足 DRF 的要求,那麼,你的程式會有這樣一個好處:

程式在弱一緻性模型下執行,執行的結果與在SC模型下執行一樣
           

這意味着,程式員在寫程式時,可以按SC模型來推斷程式的執行。而程式在底層運作時,可以享受弱一緻性模型帶來的種種優化措施。

Data Race Free 具體内容

DRF 要求多線程程式中不能有沖突的操作。

什麼是沖突的操作呢?

沖突的操作是指:兩個操作來自不同線程,操作同一位址,至少有一個是寫操作。

如何讓沖突的操作不沖突呢?

需要使用同步操作将沖突的操作隔離開。

為什麼要用同步操作将沖突的操作隔離開呢?

因為如果不隔離開,程式在弱一緻性模型下執行的結果就和在SC模型下執行的結果不一樣了。這意味着如果你用SC模型推斷程式執行結果,而程式又運作在弱一緻性模型下,那麼程式的真正結果可能和你推斷的不一樣。

那麼,又為什麼:如果不隔離開,程式在弱一緻性模型下執行結果就和SC模型下不一樣了呢?

這個問題其實在問:為什麼隔離會使得程式在弱一緻性模型下執行結果與SC模型下執行結果一緻?

這個問題用一句話來回答是:隔離使得我們可以找到所有操作的一種全序,而這種全序正是SC所需要的。

同步操作将互相沖突的操作隔離開,這種隔離為原本無序的多線程程式添加了一些順序:

  • 同步操作之間有順序了
  • 同步操作與其之前的所有操作之間有順序了
  • 同步操作與其之後的所有操作之間有順序了

這些順序保證了程式在弱一緻性模型下與在SC模型下執行結果一樣。

另外,我們還發現,有些操作之間并沒有順序保證,這正是DRF的優勢所在,這些無須順序保證的操作可以在弱一緻性模型下得到優化,同時他們的無序又不會使得執行結果與SC下有任何不同。

如果我們想找一個所有操作之間的全序,隻需要在這些無須保證順序的操作中随便選擇一個順序,另外,還需要保證那些因為同步而添加的順序關系。如此構成一個全序。這個全序正是SC模型所需要的。

由此,我們也明白了DRF的精髓:

隻保證必要的順序,不保證不必要的順序。
           

所謂必要是指,保證這些順序就可以使得程式在弱一緻性模型下的執行結果與SC模型下的執行結果一緻,不保證就不行。

繼續閱讀