Data Race Free 的前世此生

Data Race Free 是多線程程序是很是重要的概念,由於Java 和 C++的內存模型都是基於 Data Race Free 的,這篇文章將介紹這個概念的由來,另外一篇文章《對Data Race Free的理解》介紹它的主要思想。程序員

事情要追溯到遙遠的1979年, Lamport 在他的著名論文 How to make a multiprocessor computer that correctly executes multiprocess programs 中提出了從此在內存模型領域被普遍使用的概念 :sequential consistency,即順序一致性。這篇文章告訴咱們,你要作一臺多處理器的計算機,須要知足什麼條件,才能保證程序的正確性。固然,這裏的程序跑在不一樣處理器上,共享同一塊內存。雖然如今不說多處理器了,都說多核,多線程,可是問題的本質是沒有變的。就是多個執行單元一塊兒完成一個任務,而且經過共享存儲單元的方式通訊,在這種狀況下,底層的系統須要提供什麼樣的支持,才能保證計算的結果和程序員的預期是同樣的。安全

7年後的1986年,Dubois, Scheurich , Briggs 三人在論文 Memory access buffering in multiprocessors 中對 Lamport 的工做進行了擴展,他們提出了一種框架,用於分析共享內存的多處理器系統中的一致性問題。文中引入了三個 states,以此爲基礎提出了strong ordering的概念,並說明了他與Lamport提出的sequential consistency是一致的。可是,strong ordering對內存操做的限制太強了,對系統性能是一個阻礙,因此,他們又提出了 weak ordering的概念,以此提升系統性能。 知足weak ordering的系統並非 sequential consistency的,程序員們須要本身去聲明同步變量,以保證程序的正確性。多線程

又過了4年,到了1990年,Adve大媽出手了,大媽如今是內存模型這個領域的權威,Java和C++內存模型的確立都有大媽的功勞,而Java和C++內存模型中至關重要的Data Race Free 概念就是Adve大媽在這一年提出的。app

在這篇名爲 Weak ordering—a new definition的文章中,Adve對Dubois等人提出的Weak Ordering進行了新的定義,並作出了一些修改以便進一步提升系統的性能。 新的定義出於這樣一種想法,程序員習慣使用 sequential consistency來推斷程序的運行結果,而底層的系統要想取得更高的性能,又不能使用sequential consistency內存模型來運行程序。那麼框架

如何使得程序員可使用sequential consistency推斷程序結果,底層的實現又能夠進行種種優化呢?性能

解決方案是:對程序自己進行足夠的同步。優化

這種內存模型保證:若是你的程序進行了足夠的同步,那麼在個人weak oerding內存模型上運行,我能夠保證結果和你在sequential consistency模型下運行的結果同樣。spa

這樣一來,程序員保證程序正確同步,就可使用sequential consistency推斷程序結果,而底層又能夠靈活地進行各類優化,提升系統性能。.net

這裏有一個關鍵問題:線程

什麼叫「足夠的同步」

Adve提出了Data Race Free的概念,也就是說,你的程序要是知足Data Race Free的條件了,你的同步就足夠了,「足夠」的意思就是說,這程序在weak ordering上跑和在sequential consistency上跑,結果是同樣同樣的~

Adve對weak ordering給出的新定義是:

Hardware is weakly ordered with respect to a synchronization model if and only if it appears sequentially consistent to all software that obey the synchronization model.

這裏的synchronization model的一種實現方式,就是 Data Race Free。

Data Race Free 後來成爲了 Java 和 C++ 內存模型的基礎。

Java 的內存模型最先出如今1995年,可是自1997年起,這一內存模型被發現了許多嚴重的錯誤和缺陷,它阻礙了不少優化措施,對程序的安全性也沒有足夠的保證。2001年JSR 133被確立下來,由William Pugh領導,專家組的成員包括了Adve,Doug Lea, William Pugh等。2004年,JSR 133最終版本發佈。2005年,Manson Jeremy, William Pugh, 和 Sarita V. Adve 一同發表了論文 The Java memory model,描述了最新的Java內存模型,這一內存模型在Java 5.0中引入,一直沿用至今。

Java 內存模型的關鍵是:若是多線程程序知足Data Race Free,那麼內存模型保證程序執行結果和sequentially consistent模型下同樣。另外,Java 內存模型的複雜之處還在於,爲了保證程序的安全性,即便多線程程序不知足Data Race Free,咱們也要對它進行必定程度的限制,這種限制必須恰到好處,太強會阻礙合理的優化,太弱保證不了程序的安全性。

三年後的2008年,Hans-J. Boehm 和 Sarita V. Adve 一同發表了文章 Foundations of the C++ concurrency memory model,描述了C++內存模型的基礎,這一內存模型爲C++ 11標準中的線程提供了明確的語義。

C++內存模型與的關鍵在於:若是多線程程序知足Data Race Free,那麼內存模型保證程序執行結果和sequentially consistent模型下同樣。與Java內存模型不一樣,對於那些不知足 Data Race Free的多線程程序,C++內存模型不對其結果提供任何保證。另外,C++內存模型提供了一些特性用以實現不一樣的內存模型。

相關文章
相關標籤/搜索