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

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

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

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

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

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

探索c++的原子類型

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

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

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

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

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

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

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

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

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

舉個栗子

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質感拉滿

    終于,在經過了幾波預熱之后,一加Ace2 Pro的外觀真機圖在網上出現了。還是博主數碼閑聊站曝光的,這次的外觀設計還是延續了一加11的方案,只是細節上有了調整,例如新加入了鈦空灰
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛。現在,我們就開始今
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現
Top 主站蜘蛛池模板: 滦平县| 苏尼特左旗| 焦作市| 南通市| 宁都县| 屏东市| 深水埗区| 古丈县| 始兴县| 长丰县| 万荣县| 武清区| 北流市| 彭山县| 临汾市| 山西省| 云龙县| 方山县| 祁门县| 石景山区| 宜州市| 广汉市| 韩城市| 浮山县| 崇义县| 华池县| 登封市| 岳阳市| 甘肃省| 西吉县| 潞城市| 镇沅| 崇礼县| 博客| 庄河市| 楚雄市| 远安县| 兴化市| 视频| 绥棱县| 临猗县|