亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

c++中std::atomic是什么_c++原子操作與并發(fā)安全講解

穿越時空
發(fā)布: 2025-10-16 21:30:02
原創(chuàng)
182人瀏覽過
<p>std::atomic 是 C++ 中用于實現(xiàn)多線程環(huán)境下原子操作的核心工具,確保對共享變量的讀、寫和復(fù)合操作不可分割,避免數(shù)據(jù)競爭。原子操作指操作在執(zhí)行中不會被中斷,要么完全執(zhí)行,要么不執(zhí)行,無中間狀態(tài)。例如,多個線程同時對普通變量進行 i++ 操作可能導(dǎo)致結(jié)果錯誤,因其包含“讀-改-寫”三步,而使用 std::atomic<int> 可保證該操作原子性,結(jié)果正確。常見用法包括 std::atomic<int> counter{0}、std::atomic<bool> ready{false} 等,支持整型、指針等類型。主要操作有 load()(原子讀)、store(val)(原子寫)、exchange(val)(替換并返回舊值)、compare_exchange_weak/strong(比較并交換,CAS,用于無鎖編程)、fetch_add()/fetch_sub()(原子加減并返回原值),且對整型和指針支持 ++、-- 運算符重載。示例代碼中兩個線程各對 atomic 變量自增 1000 次,最終結(jié)果為 2000,體現(xiàn)其正確性。內(nèi)存序(Memory Order)控制原子操作的同步行為與性能,默認為 std::memory_order_seq_cst(順序一致性,最安全但性能較低)。其他選項包括 memory_order_relaxed(僅保證</p>

c++中std::atomic是什么_c++原子操作與并發(fā)安全講解

std::atomic 是 C++ 中用于實現(xiàn)原子操作的核心工具,它能確保對共享數(shù)據(jù)的操作在多線程環(huán)境下不會出現(xiàn)數(shù)據(jù)競爭,從而保證并發(fā)安全。簡單來說,使用 std::atomic 的變量,其讀、寫或復(fù)合操作(如自增)是“不可分割”的——其他線程無法觀察到中間狀態(tài)。

什么是原子操作?

原子操作是指一個操作在執(zhí)行過程中不會被線程調(diào)度機制打斷。也就是說,該操作要么完全執(zhí)行,要么完全不執(zhí)行,不存在部分完成的狀態(tài)。在多線程編程中,多個線程同時訪問同一變量時,如果沒有同步機制,就會導(dǎo)致未定義行為。

例如,兩個線程同時對一個普通整型變量執(zhí)行 i++,由于 i++ 實際包含“讀-改-寫”三個步驟,可能兩個線程都讀取了舊值,各自加1后再寫回去,最終只加了一次,造成數(shù)據(jù)丟失。

而如果這個變量是 std::atomic<int> 類型,則 ++ 操作會以原子方式完成,結(jié)果正確。

std::atomic 的基本用法

你可以將 std::atomic 用于整型、指針等支持原子操作的類型:

  • std::atomic<int> counter{0};
  • std::atomic<bool> ready{false};
  • std::atomic<int*> ptr{nullptr};

常用操作包括:

  • load():原子地讀取值
  • store(val):原子地寫入值
  • exchange(val):原子地替換值并返回舊值
  • compare_exchange_weak/strong(expected, desired):比較并交換(CAS),是實現(xiàn)無鎖編程的基礎(chǔ)
  • fetch_add(), fetch_sub():原子加減并返回原值
  • 對整型和指針類型,還支持 ++-- 等運算符重載

示例代碼:

立即學(xué)習(xí)C++免費學(xué)習(xí)筆記(深入)”;

#include <atomic>
#include <thread>
#include <iostream>

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

void increment() {
    for (int i = 0; i < 1000; ++i) {
        count.fetch_add(1);
    }
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    std::cout << "Final count: " << count.load() << "\n"; // 輸出 2000
}
登錄后復(fù)制

內(nèi)存序(Memory Order)控制性能與可見性

std::atomic 操作允許指定內(nèi)存序,用來控制操作的內(nèi)存同步行為。默認使用 std::memory_order_seq_cst(順序一致性),最安全但可能影響性能。

常見內(nèi)存序選項:

  • memory_order_relaxed:僅保證原子性,不保證順序。適合計數(shù)器等無需同步場景
  • memory_order_acquire:用于讀操作,保證后續(xù)讀寫不會被重排到該操作之前
  • memory_order_release:用于寫操作,保證之前的讀寫不會被重排到該操作之后
  • memory_order_acq_rel:結(jié)合 acquire 和 release
  • memory_order_seq_cst:最強一致性,所有線程看到相同操作順序

例如:

count.store(1, std::memory_order_release);
int val = count.load(std::memory_order_acquire);
登錄后復(fù)制

這種配對常用于實現(xiàn)自定義同步機制,如自旋鎖或無鎖隊列。

原子操作的限制與注意事項

std::atomic 并非萬能,使用時需注意:

  • 不是所有類型都能特化為 atomic。例如 std::atomic<std::string> 不合法,因為字符串操作無法原子化
  • 復(fù)合操作(如先檢查再修改)仍需謹慎,應(yīng)使用 compare_exchange 循環(huán)實現(xiàn)
  • 過度使用 memory_order_seq_cst 可能降低性能,應(yīng)根據(jù)需求選擇合適的內(nèi)存序
  • 原子變量不能拷貝構(gòu)造或賦值,只能通過 load/store 或原子操作修改

基本上就這些。std::atomic 提供了高效且靈活的并發(fā)控制手段,尤其適用于輕量級同步場景。掌握它,是寫出高性能、線程安全 C++ 代碼的重要一步。

以上就是c++++中std::atomic是什么_c++原子操作與并發(fā)安全講解的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

c++速學(xué)教程(入門到精通)
c++速學(xué)教程(入門到精通)

c++怎么學(xué)習(xí)?c++怎么入門?c++在哪學(xué)?c++怎么學(xué)才快?不用擔心,這里為大家提供了c++速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
熱門教程
更多>
相關(guān)推薦
熱門推薦
最新課程
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號