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