精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

震驚:這個 C++11 關鍵字讓多線程不再需要鎖?thread_local 實戰解密 !

開發
今天咱們聊一個看起來很"高大上"但其實超實用的 C++11 特性:thread_local關鍵字。

今天咱們聊一個看起來很"高大上"但其實超實用的 C++11 特性:thread_local關鍵字。我敢說,這可能是你寫多線程程序時最容易忽略,卻能一秒解決大麻煩的小技巧!

從一個真實的"故事"說起

前幾天一個 C++ 初學者求助我:"我寫的多線程程序結果總是錯的,找不到錯誤原因?"

我一看他貼出的代碼,立馬明白了問題所在:

// 全局變量,所有線程共享
int counter = 0;

void worker_function() {
    // 每個線程增加計數器100000次
    for (int i = 0; i < 100000; ++i) {
        counter++;  // 災難發生的地方!
    }
}

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

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

    std::cout << "最終計數: " << counter << std::endl;
    // 期望值:200000
    // 實際值:???(遠小于200000)

    return0;
}

這段代碼有什么問題?問題大了去了!多個線程同時讀寫同一個變量counter,沒有任何保護措施,必然導致數據競爭!

他撓撓頭問:"啊?這是什么意思?要怎么解決?加鎖嗎?"

我說:"加鎖當然可以,但是今天我要教你一招更酷的方式 —— thread_local!"

thread_local是什么神仙關鍵字?

簡單來說,thread_local就是告訴編譯器:"嘿,這個變量每個線程要有自己獨立的一份!"

它的特點就是:

  • 每個線程都有這個變量的獨立副本
  • 每個線程只能訪問自己的那份,互不干擾
  • 變量的生命周期與線程一樣長

聽起來是不是很像把變量變成了"個人財產",而不是大家一起"搶"的"公共資源"?

直觀感受:沒有thread_local VS 有thread_local

先看看沒用 thread_local 的情況:

#include <iostream>
#include <thread>
#include <vector>

// 普通全局變量 - 所有線程共享同一份
int global_counter = 0;

void increment_global(int id) {
    for (int i = 0; i < 1000; ++i) {
        global_counter++; // 多線程同時訪問,會出現數據競爭

        // 故意放慢速度,讓競爭更明顯
        if (i % 100 == 0) {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
    }
    std::cout << "線程 " << id << " 完成,全局計數: " << global_counter << std::endl;
}

int main() {
    std::vector<std::thread> threads;

    for (int i = 0; i < 5; ++i) {
        threads.push_back(std::thread(increment_global, i));
    }

    for (auto& t : threads) {
        t.join();
    }

    std::cout << "最終全局計數: " << global_counter << std::endl;
    // 期望: 5000,實際: 遠小于5000

    return0;
}

運行結果:

線程 3 完成,全局計數: 2986
線程 4 完成,全局計數: 2986
線程 1 完成,全局計數: 2986
線程 0 完成,全局計數: 2986
線程 2 完成,全局計數: 2986
最終全局計數: 2986

看到了嗎?每個線程都增加了1000次,應該是5000,但實際只有2986,丟失了近2000多次增加操作!這就是數據競爭的后果!

再看使用 thread_local 的版本:

#include <iostream>
#include <thread>
#include <vector>

// 全局變量,但使用thread_local修飾
thread_localint local_counter = 0;
// 真正的全局變量,用于匯總
int total_counter = 0;

void increment_local(int id) {
    for (int i = 0; i < 1000; ++i) {
        local_counter++; // 每個線程操作自己的副本,沒有競爭

        // 故意放慢速度
        if (i % 100 == 0) {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
    }

    // 結束時打印自己的計數值
    std::cout << "線程 " << id << " 完成,局部計數: " << local_counter << std::endl;

    // 安全地將局部計數加到全局總數中(這里仍需要適當的同步,簡化起見省略)
    total_counter += local_counter;
}

int main() {
    std::vector<std::thread> threads;

    for (int i = 0; i < 5; ++i) {
        threads.push_back(std::thread(increment_local, i));
    }

    for (auto& t : threads) {
        t.join();
    }

    std::cout << "最終總計數: " << total_counter << std::endl;
    // 期望: 5000,實際: 就是5000!

    return0;
}

運行結果:

線程 0 完成,局部計數: 1000
線程 2 完成,局部計數: 1000
線程 1 完成,局部計數: 1000
線程 3 完成,局部計數: 1000
線程 4 完成,局部計數: 1000
最終總計數: 5000

完美!每個線程都有自己的local_counter,互不干擾,最后加起來正好5000,一個都不少!

thread_local的內部工作原理是啥?

說到原理,別被嚇著——其實很簡單!

想象一下,如果沒有 thread_local,變量就像一個公共停車位,所有線程都去那停車,必然打架。

而 thread_local 就像是給每個線程都發了一張停車卡,卡上寫著"專屬停車位:XX號"。這樣每個線程都有自己的專屬空間,自然就不會打架了。

技術上講,編譯器會為每個線程分配獨立的存儲空間來存放 thread_local 變量。當線程訪問這個變量時,實際上訪問的是分配給自己的那份副本。

thread_local真實案例:線程安全的單例模式

來看個實用例子,用 thread_local 實現線程安全的單例模式:

#include <iostream>
#include <thread>
#include <string>

class ThreadLogger {
private:
std::string prefix;

// 私有構造函數
ThreadLogger(conststd::string& thread_name) : prefix("[" + thread_name + "]: ") {}

public:
// 獲取當前線程的日志實例
static ThreadLogger& getInstance(const std::string& thread_name) {
    // 每個線程都有自己的logger實例
    thread_local ThreadLogger instance(thread_name);
    return instance;
}

void log(const std::string& message) {
    std::cout << prefix << message << std::endl;
}
};

void worker(const std::string& name) {
    // 獲取當前線程的logger
    auto& logger = ThreadLogger::getInstance(name);

    logger.log("開始工作");
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
    logger.log("工作中...");
    std::this_thread::sleep_for(std::chrono::milliseconds(300));
    logger.log("完成工作");
}

int main() {
    std::thread t1(worker, "線程1");
    std::thread t2(worker, "線程2");
    std::thread t3(worker, "線程3");

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

    return0;
}

運行結果:

[線程1]: 開始工作
[線程2]: 開始工作
[線程3]: 開始工作
[線程1]: 工作中...
[線程2]: 工作中...
[線程3]: 工作中...
[線程1]: 完成工作
[線程2]: 完成工作
[線程3]: 完成工作

是不是很酷?每個線程都有自己專屬的日志對象,帶有自己的前綴,互不干擾!而且完全不需要加鎖,性能極佳!

thread_local的注意事項

話雖如此,使用 thread_local 也要注意一些坑:

  • 初始化時機:thread_local變量會在線程第一次使用它時初始化,不是在聲明時
  • 內存消耗:每個線程都會分配空間,如果變量很大,多線程環境可能會消耗大量內存
  • 不要濫用:并不是所有共享變量都需要thread_local,有時候簡單的互斥鎖更合適
  • 析構時機:thread_local對象會在線程結束時析構,而不是程序結束時

小結:thread_local到底好在哪?

總結一下 thread_local 的優點:

  • 線程安全:不需要加鎖就能避免數據競爭
  • 性能更好:沒有鎖的開銷,訪問速度更快
  • 代碼簡潔:不需要寫復雜的同步代碼
  • 解決特定問題:某些場景(如線程ID、日志前綴等)用 thread_local 非常合適

最后的"靈魂拷問"

如果我問你:

  • 全局變量是什么?—— 整個程序共享一份
  • 局部變量是什么?—— 每個函數調用有一份
  • 那 thread_local 變量是什么?—— 每個線程有一份!

懂了吧?就是這么簡單!

下次當你看到多線程程序莫名其妙出問題,先想想是不是該用thread_local!一個關鍵字,省下一堆 debug 的時間,何樂而不為?

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2023-09-22 22:27:54

autoC++11

2013-05-30 00:49:36

C++11C++條件變量

2023-09-24 13:58:20

C++1auto

2025-05-22 09:43:55

2017-05-27 20:59:30

Java多線程synchronize

2009-06-29 18:14:23

Java多線程volatile關鍵字

2013-07-31 11:09:05

C++11

2024-12-18 16:00:00

C++性能優化consteval

2020-07-17 20:15:03

架構JMMvolatile

2024-12-24 12:00:00

inlinC++17頭文件

2010-03-15 18:11:38

Java多線程

2009-08-21 14:58:56

C# this關鍵字

2009-09-02 09:24:03

C# this關鍵字

2019-12-20 15:19:41

Synchroinze線程安全

2009-06-29 18:26:11

Java多線程Synchronize同步類

2024-02-21 20:46:48

C++編程volatile

2009-08-21 14:47:59

C# base關鍵字

2009-08-26 15:16:29

C# lock關鍵字

2011-06-14 13:26:27

volatile

2022-01-10 18:11:42

C語言應用技巧
點贊
收藏

51CTO技術棧公眾號

都市激情久久综合| 在线观看日韩中文字幕| 精品视频国内| 亚洲一区在线免费观看| 久久综合九色99| 一级黄色免费看| 亚洲香蕉网站| 亚洲一区二区精品| 免费高清视频在线观看| 日本在线高清| 亚洲四区在线观看| 精品国产第一页| 中文字幕你懂的| 伊人狠狠色j香婷婷综合| 亚洲欧美国产一本综合首页| 在线观看免费不卡av| 毛片电影在线| 亚洲精选在线视频| 日产精品久久久一区二区| 国产乱码精品一区二三区蜜臂| 亚洲日韩视频| 色妞一区二区三区| 亚洲国产精品自拍视频| 日韩欧国产精品一区综合无码| 亚洲不卡一区二区三区| 最近看过的日韩成人| 奇米影视888狠狠狠777不卡| 国产精品亚洲午夜一区二区三区 | 久操视频在线免费播放| 99久久久久免费精品国产 | 成人直播在线观看| 欧美日韩视频不卡| 欧美一级片中文字幕| 久久五月精品中文字幕| 亚洲欧美日韩久久精品| 亚洲日本欧美在线| 久草在线青青草| 成人黄色国产精品网站大全在线免费观看| 国产综合福利在线| 国产乱码在线观看| 亚洲在线日韩| 97在线免费视频| 久久这里只有精品免费| 希岛爱理av一区二区三区| 一区二区三区久久精品| 91精品人妻一区二区| 久草在线综合| 亚洲成avwww人| 亚洲丝袜在线观看| 精品91福利视频| 欧美日韩国产bt| 在线观看av网页| 日韩精品三区| 在线观看一区二区视频| 激情六月丁香婷婷| 亚洲欧美小说色综合小说一区| 亚洲成人免费看| 成人免费观看在线| 97精品国产97久久久久久| 国产aⅴ爽av久久久久| 日韩国产网站| 欧美婷婷六月丁香综合色| 日韩av一二三四| 欧美性理论片在线观看片免费| 色综合久久天天| 亚洲人成无码www久久久| 一区二区三区电影大全| 欧美性jizz18性欧美| 国产成人久久婷婷精品流白浆| 色多多在线观看| 粉嫩老牛aⅴ一区二区三区| 亚洲自偷自拍熟女另类| 日韩电影免费观| 欧美性大战久久| 久国产精品视频| 国产精品一区二区三区www| 日韩一区二区电影网| 日韩女优在线视频| 欧美日日夜夜| 永久免费精品影视网站| 97在线观看免费高| 影音先锋久久精品| 日本不卡高字幕在线2019| 日韩黄色一级视频| 紧缚捆绑精品一区二区| 波多野结衣久草一区| 亚洲欧美丝袜中文综合| 国产亚洲午夜高清国产拍精品| 亚洲自拍三区| 国产精品69xx| 欧美亚洲国产一区二区三区| 五月天婷婷影视| 超碰成人97| 亚洲欧美精品伊人久久| 二区三区四区视频| 亚洲人体偷拍| 国产在线精品一区免费香蕉| 亚洲AV无码成人片在线观看| wwwwww.欧美系列| 亚洲永久激情精品| 国产高清在线a视频大全| 日韩欧美有码在线| 小日子的在线观看免费第8集| 国产亚洲精品美女久久| 在线看日韩欧美| 国产精品不卡av| 麻豆精品新av中文字幕| 久久本道综合色狠狠五月| 在线激情网站| 五月天欧美精品| 中文字幕在线视频精品| 亚洲理论电影| 欧美激情视频播放| 中文字幕制服诱惑| 波多野结衣中文字幕一区二区三区| 亚洲mv在线看| mm视频在线视频| 91精品欧美综合在线观看最新| av av在线| 欧美1区视频| 国产精品日韩欧美| 深夜福利视频网站| 一区二区三区在线观看欧美| 欧美精品aaaa| 偷窥自拍亚洲色图精选| 欧美日本在线视频中文字字幕| 一本一道精品欧美中文字幕| 91亚洲精华国产精华精华液| 黄网站色视频免费观看| 亚洲色图图片| 色婷婷av一区二区三区在线观看| 国产无人区码熟妇毛片多| 国产成人精品影视| 福利在线小视频| 日韩欧美专区| 永久免费看mv网站入口亚洲| 四虎成人在线观看| 91免费看`日韩一区二区| 97在线国产视频| 欧美午夜网站| 久久综合伊人77777蜜臀| 中文字幕一区二区三区人妻四季| 久久精品视频免费| 亚洲精品中文字幕无码蜜桃| 图片婷婷一区| 欧美一区二区三区免费视| 欧美熟女一区二区| 偷窥国产亚洲免费视频| 一区二区三区四区影院| 亚洲性感美女99在线| www.久久草| 日本一本在线免费福利| 欧美成人伊人久久综合网| 欧美黑人猛猛猛| 国产sm精品调教视频网站| 欧美一区二区视频在线播放| 亚洲一区二区三区免费| 欧美激情亚洲激情| 黑人精品一区二区三区| 香蕉成人伊视频在线观看| 91玉足脚交白嫩脚丫| 欧美中文日韩| 亚洲国产一区二区在线 | 国产不卡视频在线| 麻豆影视在线| 欧美天堂一区二区三区| 天堂网中文在线观看| 国产尤物一区二区| 毛片av在线播放| 亚洲精品一二三**| 97久久精品国产| 你懂的视频在线| 欧美在线观看视频一区二区 | 亚洲大尺度视频| 五月天一区二区| 在线观看免费小视频| 狠狠色丁香久久婷婷综| 欧美高清中文字幕| 精品大片一区二区| 成人网中文字幕| ririsao久久精品一区| 亚洲欧美国产精品| 国产美女www爽爽爽视频| 亚洲一区二区3| 国产美女永久免费无遮挡| 狠狠色丁香久久婷婷综合_中| 成年人网站国产| 精品久久影视| 亚洲综合在线播放| 在线男人天堂| 久久躁日日躁aaaaxxxx| 色吊丝在线永久观看最新版本| 欧美三级乱人伦电影| 欧美国产精品一二三| 91麻豆视频网站| 中文字幕55页| 老司机久久99久久精品播放免费| 佐佐木明希av| 国产区精品区| 国产乱子伦精品| 3d欧美精品动漫xxxx无尽| 九色成人免费视频| 岛国视频免费在线观看| 精品少妇一区二区| 中文字幕丰满人伦在线| 亚洲成a人在线观看| 日本一二三不卡视频| 不卡的av中国片| 午夜激情影院在线观看| 久久久噜噜噜久久狠狠50岁| 欧美 亚洲 视频| 欧美1级片网站| 久久免费看av| 国产suv精品一区| 91精品视频在线播放| 欧美天堂视频| 97精品在线观看| 欧美6一10sex性hd| 日韩中文在线视频| 国产一二在线观看| 亚洲精品91美女久久久久久久| 国产三级视频在线播放| 欧洲生活片亚洲生活在线观看| 日本五十熟hd丰满| 一区二区久久久| 秋霞欧美一区二区三区视频免费| 久久综合九色综合97婷婷| 麻豆免费在线观看视频| 精品无人区卡一卡二卡三乱码免费卡| 日本久久久精品视频| 伊人成年综合电影网| 日本一本草久p| 91精品一区二区三区综合| 午夜精品亚洲一区二区三区嫩草| 日韩欧美影院| 精品免费一区二区三区蜜桃| 凹凸成人在线| 99久久自偷自偷国产精品不卡| 久久久久九九精品影院| 国产一区私人高清影院| 欧美日韩国产网站| 国产福利精品av综合导导航| 欧美日韩国产观看视频| 97超碰色婷婷| 蜜桃视频在线观看播放| 91精品国产99久久久久久| 多野结衣av一区| 国语自产精品视频在线看一大j8 | 日韩久久综合| 神马影院午夜我不卡| 九一精品国产| 日韩中文不卡| 色综合色综合| 国产精品99久久久久久大便| 欧美独立站高清久久| 性欧美videosex高清少妇| 成人免费a**址| 婷婷视频在线播放| 欧美在线首页| 日韩黄色片在线| 亚洲国产欧美国产综合一区| 青青草国产精品视频| 国产婷婷精品| 亚洲 中文字幕 日韩 无码| 久久婷婷影院| www.久久91| 国产精品一区在线观看你懂的| 337p日本欧洲亚洲大胆张筱雨| 成人黄色网址在线观看| 国产中年熟女高潮大集合| 欧美国产国产综合| 男女做暖暖视频| 一区二区三区美女视频| 青青草av在线播放| 色婷婷亚洲精品| 一区不卡在线观看| 精品久久久久久久久久久院品网 | 在线午夜精品自拍| 日本韩国在线视频爽| 欧美大片网站在线观看 | 精品人伦一区二区三区蜜桃免费| 国产免费观看av| 欧美这里有精品| 国产99999| 日韩av在线免费| 欧洲美女少妇精品| 久久久久久国产三级电影| 性欧美1819sex性高清| 成人a视频在线观看| 超碰97久久| 日韩久久久久久久久久久久久| 亚洲一区在线| 97在线播放视频| 国产在线国偷精品产拍免费yy| 四虎精品一区二区| 亚洲国产激情av| 亚欧洲精品在线视频| 欧美无人高清视频在线观看| 亚洲精品久久久久久动漫器材一区 | jizz性欧美2| 欧美一区二区福利| 在线中文字幕亚洲| 亚洲欧美另类动漫| 成人免费视频国产在线观看| 五月婷六月丁香| 亚洲aⅴ怡春院| h片在线免费看| 中文字幕九色91在线| 欧美少妇网站| 97人人模人人爽人人喊38tv| 欧美午夜精品一区二区三区电影| www.av91| 国产一区二区看久久| 一级黄色片网址| 婷婷激情综合网| 精品女同一区二区三区| 在线观看亚洲区| 性孕妇free特大另类| 99视频免费观看| 亚洲成人tv| 日本免费色视频| 久久久久99精品国产片| 久久精品久久国产| 日韩视频在线你懂得| 一本一道波多野毛片中文在线| 97超级碰碰人国产在线观看| 亚洲网一区二区三区| 尤物国产精品| 奇米精品一区二区三区在线观看 | 欧美xxxx14xxxxx性爽| 欧美日韩精品免费观看视欧美高清免费大片 | 国产爆乳无码一区二区麻豆| 麻豆精品在线播放| 亚洲一二三精品| 欧美亚洲免费在线一区| 男男电影完整版在线观看| 国自产精品手机在线观看视频| 一区二区三区四区精品视频| 伊人久久青草| 免费在线欧美视频| 日本猛少妇色xxxxx免费网站| 日韩欧美亚洲综合| 青青国产在线| 欧美最近摘花xxxx摘花| 免费成人网www| 国产精品亚洲αv天堂无码| 91在线视频播放| 少妇一级淫片免费放中国| 日韩电影在线观看永久视频免费网站| 麻豆mv在线观看| 久久精品magnetxturnbtih| 亚洲一区日韩| 国产精品815.cc红桃| 色婷婷一区二区三区四区| a黄色在线观看| 国产精品嫩草影院一区二区| 精品一区二区三区在线 | 天天操天天摸天天干| 亚洲精品一区二区三区婷婷月| 快播电影网址老女人久久| 日日夜夜精品网站| 久久电影网站中文字幕 | 国产高清视频在线| 国产欧美va欧美va香蕉在| 欧美丰满日韩| 男人女人拔萝卜视频| 性久久久久久久久久久久| 理论视频在线| 国产欧美日韩丝袜精品一区| 在线国产一区| 亚洲av成人精品一区二区三区| 大荫蒂欧美视频另类xxxx| 好男人免费精品视频| 成人xxxx视频| 激情久久久久久久| www.久久av| 7777女厕盗摄久久久| 成全电影大全在线观看| 免费看成人片| 国产麻豆精品theporn| 黄色一级片免费看| 亚洲性猛交xxxxwww| 国产视频一区二| 国产美女网站在线观看| 国产农村妇女毛片精品久久麻豆| 国产婷婷在线视频| 8090成年在线看片午夜| 成人亚洲一区| 中文字幕一区二区人妻电影丶| 91福利精品第一导航| 91高清在线观看视频| 蜜桃久久精品乱码一区二区| 激情综合网av| 日韩av大片在线观看| 精品久久久999| 青青一区二区| 欧美日韩久久婷婷| 色综合久久88色综合天天6| 看黄网站在线观看| 日本免费高清一区|