最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談關(guān)于C++memory_order的理解

 更新時間:2020年08月27日 09:06:39   作者:ManateeFan  
這篇文章主要介紹了淺談關(guān)于C++memory_order的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

看了c++并發(fā)編程實戰(zhàn)的內(nèi)存模型部分后,一直對memory_order不太懂,今天在知乎發(fā)現(xiàn)了百度的brpc,恰好有關(guān)于原子操作的文檔,感覺解釋的很好。為了加深理解,再次總結(jié)一遍。

在多核編程中,我們使用鎖來避免多個線程修改同一個數(shù)據(jù)時產(chǎn)生的競爭條件。但是,鎖會消耗系統(tǒng)資源,當鎖成為性能瓶頸的時候,就需要使用另一種方法——原子指令。c++11中引入了原子類型atomic

原子指令 (x均為std::atomic) 作用x.load()返回x的值。x.store(n)把x設(shè)為n,什么都不返回。x.exchange(n)把x設(shè)為n,返回設(shè)定之前的值。x.compare_exchange_strong(expected_ref, desired)若x等于expected_ref,則設(shè)為desired,返回成功;否則把最新值寫入expected_ref,返回失敗。x.compare_exchange_weak(expected_ref, desired)相比compare_exchange_strong可能有spurious wakeup。x.fetch_add(n), x.fetch_sub(n)原子地做x += n, x-= n,返回修改之前的值。

但僅靠原子指令實現(xiàn)不了對資源的訪問控制。這造成的原因是編譯器和cpu實施了重排指令,導(dǎo)致讀寫順序會發(fā)生變化,只要不存在依賴,代碼中后面的指令可能會被放在前面,從而先執(zhí)行它。cpu這么做是為了盡量塞滿每個時鐘周期,在單位時間內(nèi)盡量執(zhí)行更多的指令,從而提高吞吐率。

下面看個例子:

// thread 1
// ready was initialized to false
p.init();
ready = true;
// thread 2
if(ready) {
 p.bar();
}

線程2在ready為true的時候會訪問p,對線程1來說,如果按照正常的執(zhí)行順序,那么p先被初始化,然后在將ready賦為true。但對多核的機器而言,情況可能有所變化:

  • 線程1中的ready = true可能會被cpu或編譯器重排到p.init()的前面,從而優(yōu)先執(zhí)行ready = true這條指令。在線程2中,p.bar()中的一些代碼可能被重排到if(ready)之前。
  • 即使沒有重排,ready和p的值也會獨立地同步到線程2所在核心的cache,線程2仍然可能在看到ready為true時看到未初始化的p。

為了解決這個問題,cpu和編譯器提供了memory fence,讓用戶可以聲明訪存指令的可見性關(guān)系,c++11總結(jié)為以下memory order:

memory order 作用
memory_order_relaxed 無fencing作用,cpu和編譯器可以重排指令
memory_order_consume 后面依賴此原子變量的訪存指令勿重排至此條指令之前
memory_order_acquire 后面訪存指令勿重排至此條指令之前
memory_order_release 前面的訪存指令勿排到此條指令之后。當此條指令的結(jié)果被同步到其他核的cache中時,保證前面的指令也已經(jīng)被同步。
memory_order_acq_rel acquare + release
memory_order_seq_cst acq_rel + 所有使用seq_cst的指令有嚴格的全序關(guān)系

有了memoryorder,我們可以這么改上面的例子:

// Thread1
// ready was initialized to false
p.init();
ready.store(true, std::memory_order_release);
// Thread2
if (ready.load(std::memory_order_acquire)) {
  p.bar();
}

線程2中的acquire和線程1的release配對,確保線程2在看到ready==true時能看到線程1 release之前所有的訪存操作。

注意,memory fence不等于可見性,即使線程2恰好在線程1在把ready設(shè)置為true后讀取了ready也不意味著它能看到true,因為同步cache是有延時的。memory fence保證的是可見性的順序:“假如我看到了a的最新值,那么我一定也得看到b的最新值”。

到此這篇關(guān)于淺談關(guān)于C++memory_order的理解的文章就介紹到這了,更多相關(guān)C++ memory order內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念

    深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念

    我們知道C語言是面向過程的編程語言,C++在C語言的基礎(chǔ)上進化出了面向?qū)ο蟮哪P?,而繼承就是面向?qū)ο蟮闹匾獙傩裕旅婢妥屝【巵砗痛蠹以敿氈v講吧
    2023-07-07
  • 一文帶你搞懂C語言預(yù)處理宏定義

    一文帶你搞懂C語言預(yù)處理宏定義

    這篇文章主要為大家詳細介紹了C語言預(yù)處理宏定義#define,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • C++面試題之數(shù)a、b的值互換(不使用中間變量)

    C++面試題之數(shù)a、b的值互換(不使用中間變量)

    這篇文章主要介紹了不使用中間變量,C++實現(xiàn)數(shù)a、b的值互相轉(zhuǎn)換操作,感興趣的小伙伴們可以參考一下
    2016-07-07
  • QT布局管理詳解QVBoxLayout與QHBoxLayout及QGridLayout的使用

    QT布局管理詳解QVBoxLayout與QHBoxLayout及QGridLayout的使用

    在這篇文章中,你將知道水平布局、垂直布局、網(wǎng)格布局如何輕松上手,以純代碼方式展示。對齊方式,大小設(shè)置,圖片頭像匹配標簽,布局器里面的組件大小隨意切換大小,認真看完這篇文章,QT布局管理器熟練使用
    2022-06-06
  • C/C++使用C語言實現(xiàn)多態(tài)

    C/C++使用C語言實現(xiàn)多態(tài)

    這篇文章主要介紹了C/C++多態(tài)的實現(xiàn)機制理解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • C語言實現(xiàn)數(shù)獨輔助器(附源碼)

    C語言實現(xiàn)數(shù)獨輔助器(附源碼)

    數(shù)獨是源自瑞士的一種數(shù)學游戲。是一種運用紙、筆進行演算的邏輯游戲。本文將利用C語言制作一個數(shù)獨輔助器,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-01-01
  • 詳解C++的反調(diào)試技術(shù)與繞過手法

    詳解C++的反調(diào)試技術(shù)與繞過手法

    反調(diào)試技術(shù),惡意代碼會用它識別自身是否被調(diào)試,或者讓調(diào)試器失效,給反病毒工程師們制造麻煩,拉長提取特征碼的時間線,本章將具體總結(jié)常見的反調(diào)試基礎(chǔ)的實現(xiàn)原理以及如何過掉這些反調(diào)試手段,從而讓我們能夠繼續(xù)分析惡意代碼
    2021-06-06
  • C++中的std::async()詳解

    C++中的std::async()詳解

    這篇文章主要給大家介紹了關(guān)于C++中std::async()的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 實例講解C++編程中l(wèi)ambda表達式的使用

    實例講解C++編程中l(wèi)ambda表達式的使用

    這篇文章主要介紹了C++編程中l(wèi)ambda表達式的使用實例,lambda表達式特性的引入在C++11中可謂千呼萬喚始出來,非常重要,需要的朋友可以參考下
    2016-01-01
  • C++基于Boost.Asio實現(xiàn)端口映射器的過程詳解

    C++基于Boost.Asio實現(xiàn)端口映射器的過程詳解

    Boost.Asio 是一個功能強大的 C++ 庫,用于異步編程和網(wǎng)絡(luò)編程,它提供了跨平臺的異步 I/O 操作,在這篇文章中,我們將深入分析一個使用 Boost.Asio 實現(xiàn)的簡單端口映射服務(wù)器,文中有詳細的代碼講解,需要的朋友可以參考下
    2023-11-11

最新評論

太仓市| 武陟县| 吉首市| 二连浩特市| 无棣县| 宁阳县| 大余县| 杂多县| 额敏县| 长泰县| 仙居县| 桂阳县| 沛县| 邻水| 泽库县| 新化县| 道孚县| 普安县| 铜川市| 阳朔县| 基隆市| 镇雄县| 石泉县| 班戈县| 托克托县| 浦东新区| 神池县| 称多县| 宝兴县| 石城县| 铜陵市| 五大连池市| 五指山市| 株洲市| 黎川县| 诸城市| 鹤岗市| 大厂| 永泰县| 巴塘县| 临夏县|