日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

解鎖 C++ 并發編程的鑰匙:探索 Atomic 變量

來源: 責編: 時間:2023-12-04 17:25:33 282觀看
導讀最近在用c++搞項目,因為多線程要做一個類似cnt的保護,今天學習了c++的原子操作。探索c++的原子類型std::atomic 類型是 C++ 提供的一種機制,用于實現多線程之間的安全共享數據。它通過原子操作來確保對共享變量的操作是

最近在用c++搞項目,因為多線程要做一個類似cnt的保護,今天學習了c++的原子操作。YWH28資訊網——每日最新資訊28at.com

YWH28資訊網——每日最新資訊28at.com

探索c++的原子類型

std::atomic 類型是 C++ 提供的一種機制,用于實現多線程之間的安全共享數據。它通過原子操作來確保對共享變量的操作是不可分割的。在多線程環境下,如果沒有適當的同步機制,對共享變量的讀寫可能會導致競爭條件,進而引發不確定的行為。std::atomic 類型提供了一種解決方案,讓我們能夠以線程安全的方式訪問這些變量。YWH28資訊網——每日最新資訊28at.com

關于具體的函數和詳細介紹可以訪問這里:https://cplusplus.com/reference/atomic/atomic/?kw=atomicYWH28資訊網——每日最新資訊28at.com

YWH28資訊網——每日最新資訊28at.com

這里介紹幾個常用的:YWH28資訊網——每日最新資訊28at.com

  • load 和 store:用于讀取和寫入原子變量的值。
  • exchange:交換原子變量的值,并返回之前的值。
  • compare_exchange_strong 和 compare_exchange_weak:比較并交換操作,可在特定條件下修改原子變量的值。
  • fetch_add 和 fetch_sub:原子地執行加法和減法操作,并返回之前的值。

這里原子操作后為什么要返回之前的值呢?YWH28資訊網——每日最新資訊28at.com

以fetch_add為例,fetch_add是用于對原子變量進行原子性地增加操作。它執行一個原子的加法操作,并返回加法操作之前的原子變量的值。YWH28資訊網——每日最新資訊28at.com

這種設計是基于并發編程中的常見需求。返回之前的值允許程序員在執行加法操作后,獲取加法之前的原始值。這樣做有以下幾個方面的優點:YWH28資訊網——每日最新資訊28at.com

  • 原子性操作的完整性:在多線程并發環境下,如果需要進行原子性的加法操作,同時又需要獲取加法前的值,fetch_add 的設計能夠保證這兩個操作的原子性。它在單個原子操作中完成增加操作,并返回增加前的值,避免了在多線程環境下的競態條件。
  • 避免競態條件:返回之前的值可以讓程序員在進行加法操作之后,檢查原子變量的舊值,并根據舊值進行后續的操作。這對于實現一些特定的同步模式或算法是非常有用的,因為它避免了因為操作間的競爭導致的意外結果。

舉個栗子

這里做一個簡單的線程池,并實現一個task,task的任務就是對原子變量counter進行遞增,最后我們看結果是否與預期一致,這里線程池實現10個線程,給線程池推送100000個task。YWH28資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <mutex>#include <condition_variable>#include <queue>#include <functional>#include <atomic>class ThreadPool {public:    ThreadPool(size_t numThreads) : stop(false) {        for (size_t i = 0; i < numThreads; ++i) {            threads.emplace_back([this] {                while (true) {                    std::function<void()> task;                    {                        std::unique_lock<std::mutex> lock(queueMutex);                        condition.wait(lock, [this] { return stop || !tasks.empty(); });                        if (stop && tasks.empty()) {                            return;                        }                        task = std::move(tasks.front());                        tasks.pop();                    }                    task();                }            });        }    }    template <class F>    void AddTask(F&& f) {        {            std::lock_guard<std::mutex> lock(queueMutex);            tasks.emplace(std::forward<F>(f));        }        condition.notify_one();    }    ~ThreadPool() {        {            std::lock_guard<std::mutex> lock(queueMutex);            stop = true;        }        condition.notify_all();        for (std::thread& worker : threads) {            worker.join();        }    }private:    std::vector<std::thread> threads;    std::queue<std::function<void()>> tasks;    std::mutex queueMutex;    std::condition_variable condition;    bool stop;};int main() {    std::atomic<int> counter(0);    ThreadPool pool(10);    constexpr int numTasks = 100000;    for (int i = 0; i < numTasks; ++i) {        pool.AddTask([&counter]() {            counter++;        });    }    std::cout << "Waiting for tasks to complete..." << std::endl;    //注意:這里不會確保所有任務已經執行完畢,僅僅是等待一段時間以展示結果    std::this_thread::sleep_for(std::chrono::seconds(5));    std::cout << "Final Counter Value: " << counter << std::endl;    return 0;}

我們預期最后的結果是100000。g++編譯,不要忘記加-lpthread,執行:YWH28資訊網——每日最新資訊28at.com

YWH28資訊網——每日最新資訊28at.com

細心的小伙伴可能發現我的代碼直接使用的counter++,這里需要注意,這只是個簡單的測試代碼,實際項目中要最好使用counter.fetch_add(1),因為counter++不保證++是個原子操作。我在項目中遇到了該問題,最后加出來總會比預期值少,后來換成fetch_add后就正常了。YWH28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-37660-0.html解鎖 C++ 并發編程的鑰匙:探索 Atomic 變量

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一圖詳解五種前端架構

下一篇: 深入淺出JavaScript異步編程

標簽:
  • 熱門焦點
  • 0糖0卡0脂 旭日森林仙草烏龍茶優惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時要賣為79.9元,今日下單領取50元優惠券,到手價為29.9元。產品規格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當家&rdquo;的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 三星獲批量產iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續在今年9月舉辦一年一度的秋季新品發布會,有傳言稱發布會將于9月12日舉行,屆時全新的iPhone 15系列將正式與大家見面,不出意外的話
  • 三星顯示已開始為AR設備研發硅基LED微顯示屏

    7月18日消息,據外媒報道,隨著蘋果首款頭顯產品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產品也就將成為各大公司下一個重要的競爭領域,對顯示屏這一關
  • iQOO Neo8 Pro搶先上架:首發天璣9200+ 安卓性能之王

    經過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調校的作品。隨著發布時
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
  • 榮耀Magic4 至臻版 首創智慧隱私通話 強勁影音系統

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續發布自己的最新產品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產品,基
Top 主站蜘蛛池模板: 海城市| 正镶白旗| 柳江县| 托克逊县| 长泰县| 济源市| 亚东县| 和田市| 阜平县| 曲阳县| 上栗县| 萝北县| 萨嘎县| 无为县| 怀柔区| 云霄县| 浏阳市| 西林县| 英德市| 安福县| 苗栗市| 铜山县| 云龙县| 邹城市| 祁连县| 云阳县| 肇东市| 邛崃市| 龙州县| 绥芬河市| 阿城市| 永吉县| 雷波县| 昌宁县| 梨树县| 林甸县| 杨浦区| 谢通门县| 南投市| 浮山县| 甘德县|