AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

來(lái)源: 責(zé)編: 時(shí)間:2023-12-04 17:25:33 277觀看
導(dǎo)讀最近在用c++搞項(xiàng)目,因?yàn)槎嗑€程要做一個(gè)類似cnt的保護(hù),今天學(xué)習(xí)了c++的原子操作。探索c++的原子類型std::atomic 類型是 C++ 提供的一種機(jī)制,用于實(shí)現(xiàn)多線程之間的安全共享數(shù)據(jù)。它通過(guò)原子操作來(lái)確保對(duì)共享變量的操作是

最近在用c++搞項(xiàng)目,因?yàn)槎嗑€程要做一個(gè)類似cnt的保護(hù),今天學(xué)習(xí)了c++的原子操作。kmd28資訊網(wǎng)——每日最新資訊28at.com

kmd28資訊網(wǎng)——每日最新資訊28at.com

探索c++的原子類型

std::atomic 類型是 C++ 提供的一種機(jī)制,用于實(shí)現(xiàn)多線程之間的安全共享數(shù)據(jù)。它通過(guò)原子操作來(lái)確保對(duì)共享變量的操作是不可分割的。在多線程環(huán)境下,如果沒(méi)有適當(dāng)?shù)耐綑C(jī)制,對(duì)共享變量的讀寫可能會(huì)導(dǎo)致競(jìng)爭(zhēng)條件,進(jìn)而引發(fā)不確定的行為。std::atomic 類型提供了一種解決方案,讓我們能夠以線程安全的方式訪問(wèn)這些變量。kmd28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于具體的函數(shù)和詳細(xì)介紹可以訪問(wèn)這里:https://cplusplus.com/reference/atomic/atomic/?kw=atomickmd28資訊網(wǎng)——每日最新資訊28at.com

kmd28資訊網(wǎng)——每日最新資訊28at.com

這里介紹幾個(gè)常用的:kmd28資訊網(wǎng)——每日最新資訊28at.com

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

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

以fetch_add為例,fetch_add是用于對(duì)原子變量進(jìn)行原子性地增加操作。它執(zhí)行一個(gè)原子的加法操作,并返回加法操作之前的原子變量的值。kmd28資訊網(wǎng)——每日最新資訊28at.com

這種設(shè)計(jì)是基于并發(fā)編程中的常見(jiàn)需求。返回之前的值允許程序員在執(zhí)行加法操作后,獲取加法之前的原始值。這樣做有以下幾個(gè)方面的優(yōu)點(diǎn):kmd28資訊網(wǎng)——每日最新資訊28at.com

  • 原子性操作的完整性:在多線程并發(fā)環(huán)境下,如果需要進(jìn)行原子性的加法操作,同時(shí)又需要獲取加法前的值,fetch_add 的設(shè)計(jì)能夠保證這兩個(gè)操作的原子性。它在單個(gè)原子操作中完成增加操作,并返回增加前的值,避免了在多線程環(huán)境下的競(jìng)態(tài)條件。
  • 避免競(jìng)態(tài)條件:返回之前的值可以讓程序員在進(jìn)行加法操作之后,檢查原子變量的舊值,并根據(jù)舊值進(jìn)行后續(xù)的操作。這對(duì)于實(shí)現(xiàn)一些特定的同步模式或算法是非常有用的,因?yàn)樗苊饬艘驗(yàn)椴僮鏖g的競(jìng)爭(zhēng)導(dǎo)致的意外結(jié)果。

舉個(gè)栗子

這里做一個(gè)簡(jiǎn)單的線程池,并實(shí)現(xiàn)一個(gè)task,task的任務(wù)就是對(duì)原子變量counter進(jìn)行遞增,最后我們看結(jié)果是否與預(yù)期一致,這里線程池實(shí)現(xiàn)10個(gè)線程,給線程池推送100000個(gè)task。kmd28資訊網(wǎng)——每日最新資訊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;    //注意:這里不會(huì)確保所有任務(wù)已經(jīng)執(zhí)行完畢,僅僅是等待一段時(shí)間以展示結(jié)果    std::this_thread::sleep_for(std::chrono::seconds(5));    std::cout << "Final Counter Value: " << counter << std::endl;    return 0;}

我們預(yù)期最后的結(jié)果是100000。g++編譯,不要忘記加-lpthread,執(zhí)行:kmd28資訊網(wǎng)——每日最新資訊28at.com

kmd28資訊網(wǎng)——每日最新資訊28at.com

細(xì)心的小伙伴可能發(fā)現(xiàn)我的代碼直接使用的counter++,這里需要注意,這只是個(gè)簡(jiǎn)單的測(cè)試代碼,實(shí)際項(xiàng)目中要最好使用counter.fetch_add(1),因?yàn)閏ounter++不保證++是個(gè)原子操作。我在項(xiàng)目中遇到了該問(wèn)題,最后加出來(lái)總會(huì)比預(yù)期值少,后來(lái)?yè)Q成fetch_add后就正常了。kmd28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 一圖詳解五種前端架構(gòu)

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

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競(jìng)品的一加也坐不住了。一加中國(guó)區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 摸魚心法第一章——和配置文件說(shuō)拜拜

    為了能摸魚我們團(tuán)隊(duì)做了容器化,但是帶來(lái)的問(wèn)題是服務(wù)配置文件很麻煩,然后大家在群里進(jìn)行了“親切友好”的溝通圖片圖片圖片圖片對(duì)比就對(duì)比,簡(jiǎn)單對(duì)比下獨(dú)立配置中心和k8s作為配
  • CSS單標(biāo)簽實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)logo

    轉(zhuǎn)轉(zhuǎn)品牌升級(jí)后更新了全新的Logo,今天我們用純CSS來(lái)實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)的新Logo,為了有一定的挑戰(zhàn)性,這里我們只使用一個(gè)標(biāo)簽實(shí)現(xiàn),將最大化的使用CSS能力完成Logo的繪制與動(dòng)畫效果。新logo
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數(shù)量是否小于或等于一個(gè)數(shù)字。例如,一個(gè)擁有三個(gè)或更多子項(xiàng)的grid。你可能會(huì)想,為什么需要這樣做呢?在某些情況下,一個(gè)組件或一個(gè)布局可能會(huì)
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時(shí)代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進(jìn)行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲(chǔ)中可能會(huì)受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 東方甄選單飛:有些鳥注定是關(guān)不住的

    作者:彭寬鴻來(lái)源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創(chuàng)始人俞敏洪帶隊(duì)的&ldquo;7天甘肅行&rdquo;直播活動(dòng)已在近日順利收官。成立后一
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發(fā)布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時(shí)代麒麟電池,容量為101kWh,電壓為726.7V,可以預(yù)測(cè)小
  • Windows 11發(fā)布,微軟一改往常對(duì)老機(jī)型開放的態(tài)度

    距離 Windows 11 發(fā)布已經(jīng)過(guò)去一周,在過(guò)去一周里,很多數(shù)碼愛(ài)好者圍繞其對(duì) Android 應(yīng)用的支持、對(duì)老機(jī)型的升級(jí)問(wèn)題展開了激烈討論。與以往不同的是,在這次大
  • 榮耀Magic4 至臻版 首創(chuàng)智慧隱私通話 強(qiáng)勁影音系統(tǒng)

    2022年第一季度臨近尾聲,在該季度內(nèi),許多品牌陸續(xù)發(fā)布自己的最新產(chǎn)品,讓大家從全新的角度來(lái)了解當(dāng)今的手機(jī)技術(shù)。手機(jī)是電子設(shè)備中,更新迭代十分迅速的一款產(chǎn)品,基
Top