對 Data Race Free 的理解

Data Race Free 的動機

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

程序在弱一致性模型下執行,執行的結果與在SC模型下執行同樣

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

Data Race Free 具體內容

DRF 要求多線程程序中不能有衝突的操做。github

什麼是衝突的操做呢?markdown

衝突的操做是指:兩個操做來自不一樣線程,操做同一地址,至少有一個是寫操做。多線程

如何讓衝突的操做不衝突呢?post

須要使用同步操做將衝突的操做隔離開。優化

爲何要用同步操做將衝突的操做隔離開呢?spa

由於若是不隔離開,程序在弱一致性模型下執行的結果就和在SC模型下執行的結果不同了。這意味着若是你用SC模型推斷程序執行結果,而程序又運行在弱一致性模型下,那麼程序的真正結果可能和你推斷的不同。線程

那麼,又爲何:若是不隔離開,程序在弱一致性模型下執行結果就和SC模型下不同了呢?code

這個問題其實在問:爲何隔離會使得程序在弱一致性模型下執行結果與SC模型下執行結果一致?

這個問題用一句話來回答是:隔離使得咱們能夠找到全部操做的一種全序,而這種全序正是SC所須要的。

同步操做將相互衝突的操做隔離開,這種隔離爲本來無序的多線程程序添加了一些順序:

  • 同步操做之間有順序了
  • 同步操做與其以前的全部操做之間有順序了
  • 同步操做與其以後的全部操做之間有順序了

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

另外,咱們還發現,有些操做之間並無順序保證,這正是DRF的優點所在,這些無須順序保證的操做能夠在弱一致性模型下獲得優化,同時他們的無序又不會使得執行結果與SC下有任何不一樣。

若是咱們想找一個全部操做之間的全序,只須要在這些無須保證順序的操做中隨便選擇一個順序,另外,還須要保證那些由於同步而添加的順序關係。如此構成一個全序。這個全序正是SC模型所須要的。

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

只保證必要的順序,不保證沒必要要的順序。

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

相關文章
相關標籤/搜索