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

C++原子操作的內存序使用及說明(memory ordering)

 更新時間:2026年05月20日 16:29:30   作者:當歸. z Z  
內存序主要用于控制多線程環(huán)境下的操作可見性和執(zhí)行順序,包括無序、消費序、獲取、Release、Acq_Rels和_Seq_Cstt等等滿足不同MW操作和嚴格順序需求,根據不同場景選擇合適的內存序,如可有助于優(yōu)化性能和確保數據一致性

std::memory_order 用于指定原子操作的內存順序約束,控制多線程環(huán)境下的操作可見性和執(zhí)行順序。

1.memory_order_relaxed(松散順序)

特點

  • 無同步或順序約束:僅保證原子操作的原子性,不保證操作順序。
  • 性能最高:適合不需要同步的場景(如計數器)。

示例

std::atomic<int> counter{0};

void increment() {
    counter.fetch_add(1, std::memory_order_relaxed); // 無同步保證
}

適用場景

  • 統(tǒng)計計數、無競爭場景(如性能計數器)。

2.memory_order_consume(消費順序)

特點

  • 比 acquire 更弱:僅保證依賴該原子變量的操作不被重排。
  • 用于數據依賴鏈(如指針解引用)。

示例

std::atomic<int*> ptr{nullptr};
int data = 0;

void producer() {
    data = 42;
    ptr.store(&data, std::memory_order_release); // 發(fā)布指針
}

void consumer() {
    int* p;
    while (!(p = ptr.load(std::memory_order_consume))) { // 消費指針
        // 等待
    }
    assert(*p == 42); // 僅保證 p 依賴的操作有序
}

適用場景

  • 適用于指針或數據依賴的場景(比 acquire 更高效)。

3.memory_order_acquire(獲取順序)

特點

  • 與 release 配對,確保后續(xù)操作不會重排到 acquire 之前。
  • 讀取同步:保證看到 release 之前的修改。

示例

std::atomic<bool> ready{false};
int data = 0;

void producer() {
    data = 42;
    ready.store(true, std::memory_order_release); // 發(fā)布數據
}

void consumer() {
    while (!ready.load(std::memory_order_acquire)) { // 等待 release
        // 自旋
    }
    assert(data == 42); // 保證看到 data = 42
}

適用場景

  • 鎖的獲取、線程間數據同步。

4.memory_order_release(釋放順序)

特點

  • 與 acquire 配對,確保之前的操作不會重排到 release 之后。
  • 寫入同步:保證修改對 acquire 線程可見。

示例

std::atomic<int> flag{0};
int data = 0;

void producer() {
    data = 42;
    flag.store(1, std::memory_order_release); // 確保 data = 42 在 flag = 1 之前
}

void consumer() {
    while (flag.load(std::memory_order_acquire) != 1) { // 等待 release
        // 自旋
    }
    assert(data == 42); // 保證看到 data = 42
}

適用場景

  • 鎖的釋放、線程間數據發(fā)布。

5.memory_order_acq_rel(獲取-釋放順序)

特點

同時具備 acquire 和 release 語義

  • 如果是讀-修改-寫(RMW)操作(如 fetch_add),則:
  • 讀取部分 采用 acquire 語義(防止后續(xù)操作重排到前面)。
  • 寫入部分 采用 release 語義(防止前面操作重排到后面)。

適用于 CAS(Compare-And-Swap)等操作。

示例

std::atomic<int> counter{0};

void increment() {
    counter.fetch_add(1, std::memory_order_acq_rel); // 讀-修改-寫
}

適用場景

  • 自旋鎖、無鎖數據結構(如隊列、棧)。

6.memory_order_seq_cst(順序一致性)

特點

  • 最強約束:所有 seq_cst 操作按全局順序執(zhí)行(類似互斥鎖)。
  • 默認選項(如果不指定內存序,原子操作默認使用 seq_cst)。
  • 性能較低,但最安全。

示例

std::atomic<bool> x{false}, y{false};
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() {
    while (!x.load(std::memory_order_seq_cst)) {}
    if (y.load(std::memory_order_seq_cst)) {
        z++; // 保證 x 和 y 的修改順序一致
    }
}

適用場景

  • 需要嚴格順序的場景(如 Dekker 算法、Peterson 鎖)。

7.總結

內存序作用適用場景
relaxed僅保證原子性,無順序約束計數器、無競爭統(tǒng)計
consume僅保證依賴該原子變量的操作有序指針發(fā)布(較少使用)
acquire保證后續(xù)操作不會重排到它之前(讀同步)鎖獲取、數據同步
release保證之前操作不會重排到它之后(寫同步)鎖釋放、數據發(fā)布
acq_rel同時具備 acquire 和 release(用于 RMW 操作)自旋鎖、無鎖數據結構
seq_cst全局順序一致(最強約束,性能最低)需要嚴格順序的算法

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C語言求質數的幾種簡單易懂方式

    C語言求質數的幾種簡單易懂方式

    這篇文章主要介紹了C語言求質數的幾種簡單易懂方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C語言gets()與fgets() 函數的區(qū)別

    C語言gets()與fgets() 函數的區(qū)別

    本文主要介紹了C語言gets()與fgets() 函數的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-12-12
  • C++ 數據結構二叉樹(前序/中序/后序遞歸、非遞歸遍歷)

    C++ 數據結構二叉樹(前序/中序/后序遞歸、非遞歸遍歷)

    這篇文章主要介紹了C++ 數據結構二叉樹(前序/中序/后序遞歸、非遞歸遍歷)的相關資料,這里提供實例代碼來幫助大家理解掌握二叉樹,需要的朋友可以參考下
    2017-07-07
  • C++?vector與數組轉換寫入/讀出文件方式

    C++?vector與數組轉換寫入/讀出文件方式

    這篇文章主要介紹了C++?vector與數組轉換寫入/讀出文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Qt實現獲取基本網絡信息

    Qt實現獲取基本網絡信息

    這篇文章主要為大家詳細介紹了Qt實現獲取基本網絡信息的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • C++實現LeetCode(78.子集合)

    C++實現LeetCode(78.子集合)

    這篇文章主要介紹了C++實現LeetCode(78.子集合),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 手把手帶你學習C++的數據類型

    手把手帶你學習C++的數據類型

    這篇文章主要為大家介紹了C++的數據類型,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助
    2021-11-11
  • C++中queue容器的具體使用

    C++中queue容器的具體使用

    本文主要介紹了C++中queue容器的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • C++實現LeetCode(38.計數和讀法)

    C++實現LeetCode(38.計數和讀法)

    這篇文章主要介紹了C++實現LeetCode(38.計數和讀法),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • QT?UDP網絡編程實現簡單消息傳輸

    QT?UDP網絡編程實現簡單消息傳輸

    這篇文章主要為大家詳細介紹了QT?UDP網絡編程實現簡單消息傳輸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

永宁县| 娱乐| 新竹市| 水富县| 冷水江市| 罗源县| 林西县| 石屏县| 隆林| 池州市| 报价| 曲水县| 衡阳市| 新兴县| 雅安市| 奉节县| 南和县| 深水埗区| 宣化县| 丁青县| 皮山县| 湟源县| 东海县| 哈巴河县| 白银市| 内黄县| 昂仁县| 长海县| 博罗县| 闵行区| 台中县| 明水县| 谷城县| 乌拉特前旗| 那坡县| 彭泽县| 中山市| 荔波县| 开江县| 保德县| 襄城县|