memory order 內(nèi)存模型,reorder,memory_order_acquire - C++知識(shí)總結(jié)二

三種內(nèi)存模型

這篇文章講的很好
https://www.codedump.info/post/20191214-cxx11-memory-model-2/

三種內(nèi)存模型(https://www.codedump.info/post/20191214-cxx11-memory-model-2/):

  • Sequential Consistency 順序一致性,簡稱SC
  • Total Store Ordering, 全存儲(chǔ)排序,簡稱TSO
  • Relaxed memory models,松弛型內(nèi)存模型

四種讀寫關(guān)系

Sequential Consistency

memory_order_seq_cst,即順序一致性模型。

Acquire-Release 模式

memory_order_release前面不會(huì)被reord到本句之后;memory_order_acquire之后的代碼不會(huì)被reorder到本句之前;memory_order_acq_rel同時(shí)包含acquire和release標(biāo)志。

這是一段實(shí)踐代碼,代碼簡單明確:https://www.cnblogs.com/lizhanzhe/p/10893016.html

#include <thread>
#include <chrono>
#include <mutex>
#include <thread>
#include <assert.h>
#include <atomic>

std::atomic<int> a=0, b=0, c = 0;

void t1_fun() {
    a = 1;
    b.store(2, std::memory_order_relaxed); //relaxed,松散的
    
    //memory_order_release,類似于mutex的unlock,自身線程中它之前的讀寫語句都會(huì)執(zhí)行完,不會(huì)被優(yōu)化到本句之后
    c.store(3, std::memory_order_release);
    
}
void t2_fun() {
    //memory_order_acquire, 類似于mutex的lock,自身線程它后面的讀寫語句一定是在后面執(zhí)行的,不會(huì)被優(yōu)化到本句之前
    while (c.load(std::memory_order_acquire) != 3); // 以下 assert 永遠(yuǎn)不會(huì)失敗 
    assert(a == 1 && b == 2);
    assert(b.load(std::memory_order_relaxed) == 2);
}
int main() {
    std::thread t1(t1_fun);
    std::thread t2(t2_fun);
    t1.join();
    t2.join();
}

Release-Consume 模式

memory_order_consume,只約束mutex對(duì)象的memory order,不約束上下文中其他變量

a = 0;
c = 0;
thread 1:{
    a = 1; 
    c.store(3, memory_order_release);
}
thread 2:{ 
    //consume只約束mutex對(duì)象的memory order,不約束上下文中其他變量
    while (c.load(memory_order_consume) != 3) ; 
    assert(a == 1); // assert 可能失敗也可能不失敗
}

Relaxed模式

松散的,不約束。線程內(nèi)部可以reorder。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容