C++11 Memory Model

Herb Sutter在一次對C++11內(nèi)存模型的演講中提到C++11的內(nèi)存模型井仰,讓C++有了標準獨立于編譯器和平臺線程庫和標準的多線程內(nèi)存控制方式进泼。

咋一看這個句話很奇怪监憎,難道C++98/03及以前的內(nèi)存模型不支持多線程嗎渔期, 用C++03的標準不照樣寫多線程程序镊叁。 其實我忽略了一個事實在B家同學們都是gcc & linux,潛意識posix標準的pthread就是C++的線程庫存团秽,其實還有cl & windows:)

C++標準是基于一個抽象的機器制定的(大部分語言標準應該也是這樣)主胧,它沒有具體的CPU或編譯器。 C++98/03標準沒有對每次讀寫(loads and stores)以及執(zhí)行順序作出規(guī)定习勤,所以無法寫出完全可移植的多線程代碼(能同時支持freebsd踪栋,linux和windows就很不錯了)。C++11標準則在設計上引入了支持多線程的內(nèi)存模型图毕,它規(guī)定了在多線程環(huán)境中內(nèi)存的讀寫的操作以及可能的執(zhí)行順序1夷都。

在cppreference.com上可以看到loadstore的原型如下,

T load( std::memory_order order = std::memory_order_seq_cst ) const noexcept;
void store( T desired, std::memory_order order = std::memory_order_seq_cst ) noexcept;

對于memory order多線程環(huán)境中(CPU也是亂序執(zhí)行的)的幾種規(guī)定如下下表,

Value Explanation
memory_order_relaxed 對其它讀寫操作沒有同步予颤,只保證本操作是原子的
memory_order_consume load操作囤官,當前線程依賴該原子變量的訪存操作不能reorder到該指令之前,對其他線程store操作(release)可見
memory_order_acquire load操作蛤虐,當前線程所有訪存操作不能reorder到該指令之前党饮,對其他線程store操作(release)可見
memory_order_release store操作,當前線程所有訪存操作不能reorder到該指令之后驳庭,對其他線程load操作(consume)可見
memory_order_acq_rel load/store操作刑顺,memory_order_acquire + memory_order_release
memory_order_seq_cst memory_order_acq_rel + 順序一致性(sequential consisten)

關于memory_order_seq_cst與memory_order_acq_rel,下面這段代碼很直觀的體現(xiàn)了嚷掠,

#include <thread>
#include <atomic>
#include <cassert>
 
std::atomic<bool> x = {false};
std::atomic<bool> y = {false};
std::atomic<int> z = {0};
 
void write_x()
{
    x.store(true, std::memory_order_seq_cst);
}
 
void write_y()
{
    y.store(true, std::memory_order_seq_cst);
}
 
void read_x_then_y()
{
    while (!x.load(std::memory_order_seq_cst))
        ;
    if (y.load(std::memory_order_seq_cst)) {
        ++z;
    }
}
 
void read_y_then_x()
{
    while (!y.load(std::memory_order_seq_cst))
        ;
    if (x.load(std::memory_order_seq_cst)) {
        ++z;
    }
}
 
int main()
{
    std::thread a(write_x);
    std::thread b(write_y);
    std::thread c(read_x_then_y);
    std::thread d(read_y_then_x);
    a.join(); b.join(); c.join(); d.join();
    assert(z.load() != 0);  // will never happen
}

<p>
知乎上有個G家的stephen w很認真的翻閱了經(jīng)典計算機體系結(jié)構:量化研究方法給了不錯的總結(jié)2,

"SC要求所有內(nèi)存操作表現(xiàn)為(appear)逐個執(zhí)行(任一次的執(zhí)行結(jié)果都像是所有處理器的操作都以某種次序執(zhí)行),每個處理器中的操作都以其程序指定的次序執(zhí)行荞驴。SC有兩點要求:在每個處理器內(nèi)不皆,維護每個處理器的程序次序;在所有處理器間熊楼,維護單一的表征所有操作的次序霹娄。對于寫操作W1, W2, 不能出現(xiàn)從處理器 P1 看來,執(zhí)行次序為 W1->W2; 從處理器 P2 看來鲫骗,執(zhí)行次序卻為 W2->W1 這種情況犬耻。

<p>
參考鏈接

  1. https://stackoverflow.com/questions/6319146/c11-introduced-a-standardized-memory-model-what-does-it-mean-and-how-is-it-g
  2. https://www.zhihu.com/question/24301047/answer/83422523
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市执泰,隨后出現(xiàn)的幾起案子枕磁,更是在濱河造成了極大的恐慌,老刑警劉巖术吝,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件计济,死亡現(xiàn)場離奇詭異茸苇,居然都是意外死亡,警方通過查閱死者的電腦和手機沦寂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門学密,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人传藏,你說我怎么就攤上這事腻暮。” “怎么了毯侦?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵哭靖,是天一觀的道長。 經(jīng)常有香客問我叫惊,道長款青,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任霍狰,我火速辦了婚禮抡草,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔗坯。我一直安慰自己康震,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布宾濒。 她就那樣靜靜地躺著腿短,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绘梦。 梳的紋絲不亂的頭發(fā)上橘忱,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音卸奉,去河邊找鬼钝诚。 笑死,一個胖子當著我的面吹牛榄棵,可吹牛的內(nèi)容都是我干的凝颇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疹鳄,長吁一口氣:“原來是場噩夢啊……” “哼拧略!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘪弓,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垫蛆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體月褥,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡弛随,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宁赤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舀透。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖决左,靈堂內(nèi)的尸體忽然破棺而出愕够,到底是詐尸還是另有隱情,我是刑警寧澤佛猛,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布惑芭,位于F島的核電站,受9級特大地震影響继找,放射性物質(zhì)發(fā)生泄漏遂跟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一婴渡、第九天 我趴在偏房一處隱蔽的房頂上張望幻锁。 院中可真熱鬧,春花似錦边臼、人聲如沸哄尔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岭接。三九已至,卻和暖如春臼予,著一層夾襖步出監(jiān)牢的瞬間鸣戴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工粘拾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窄锅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓半哟,卻偏偏與公主長得像酬滤,于是被迫代替她去往敵國和親签餐。 傳聞我的和親對象是個殘疾皇子寓涨,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實習到現(xiàn)在,面了一些公司氯檐,掛了不少戒良,但最終還是拿到小米、百度冠摄、阿里糯崎、京東几缭、新浪、CVTE沃呢、樂視家的研發(fā)崗...
    時芥藍閱讀 42,246評論 11 349
  • 接著上節(jié) mutex年栓,本節(jié)主要介紹atomic的內(nèi)容,練習代碼地址薄霜。本文參考http://www.cplusplu...
    jorion閱讀 73,648評論 1 14
  • 本文基于周志明的《深入理解java虛擬機 JVM高級特性與最佳實踐》所寫某抓。特此推薦。 衡量一個服務性能的高低好壞惰瓜,...
    陽光的技術小棧閱讀 1,077評論 0 3
  • ?什么是詢價單: 詢價單是采購商在阿里巴巴上發(fā)布的采購需求否副,包含采購產(chǎn)品的圖文說明、采購量崎坊、采購商的聯(lián)系方式备禀、收獲...
    Ali陳李港閱讀 578評論 0 0
  • 人從18歲到20歲之間是怎樣的體驗呢?這是最近總想稍稍弄明白的問題奈揍。 有一天在圖書館翻閱過期的《環(huán)球熒幕》合集...
    高倉一閱讀 245評論 0 0