Data Race Free 是對多線程程序 同步程度 的一種描述,假如你的多線程程序的同步程度滿足 DRF 的要求,那麼,你的程序會有這樣一個好處:
程序在弱一致性模型下執行,執行的結果與在SC模型下執行一樣
這意味著,程序員在寫程序時,可以按SC模型來推斷程序的執行。而程序在底層運行時,可以享受弱一致性模型帶來的種種優化措施。
DRF 要求多線程程序中不能有沖突的操作。
什麼是沖突的操作呢?
沖突的操作是指:兩個操作來自不同線程,操作同一地址,至少有一個是寫操作。
如何讓沖突的操作不沖突呢?
需要使用同步操作將沖突的操作隔離開。
為什麼要用同步操作將沖突的操作隔離開呢?
因為如果不隔離開,程序在弱一致性模型下執行的結果就和在SC模型下執行的結果不一樣了。這意味著如果你用SC模型推斷程序執行結果,而程序又運行在弱一致性模型下,那麼程序的真正結果可能和你推斷的不一樣。
那麼,又為什麼:如果不隔離開,程序在弱一致性模型下執行結果就和SC模型下不一樣了呢?
這個問題其實在問:為什麼隔離會使得程序在弱一致性模型下執行結果與SC模型下執行結果一致?
這個問題用一句話來回答是:隔離使得我們可以找到所有操作的一種全序,而這種全序正是SC所需要的。
同步操作將相互沖突的操作隔離開,這種隔離為原本無序的多線程程序添加了一些順序:
這些順序保證了程序在弱一致性模型下與在SC模型下執行結果一樣。
另外,我們還發現,有些操作之間並沒有順序保證,這正是DRF的優勢所在,這些無須順序保證的操作可以在弱一致性模型下得到優化,同時他們的無序又不會使得執行結果與SC下有任何不同。
如果我們想找一個所有操作之間的全序,只需要在這些無須保證順序的操作中隨便選擇一個順序,另外,還需要保證那些因為同步而添加的順序關系。如此構成一個全序。這個全序正是SC模型所需要的。
由此,我們也明白了DRF的精髓:
只保證必要的順序,不保證不必要的順序。
所謂必要是指,保證這些順序就可以使得程序在弱一致性模型下的執行結果與SC模型下的執行結果一致,不保證就不行。