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

解開(kāi)C++之call_once的神秘面紗:記一個(gè)有意思的問(wèn)題筆記

開(kāi)發(fā) 前端
最近因?yàn)轫?xiàng)目要求用C++,項(xiàng)目中需要一個(gè)接口只調(diào)用一次,需要使用到C++的call_once機(jī)制,于是寫(xiě)一個(gè)小demo來(lái)測(cè)試,就因?yàn)檫@個(gè)足夠小發(fā)現(xiàn)了一個(gè)非常有意思的問(wèn)題。

引言

最近因?yàn)轫?xiàng)目要求用c++,之前一直很討厭c++,沒(méi)辦法只能短時(shí)間彌補(bǔ)c++的知識(shí),項(xiàng)目中需要一個(gè)接口只調(diào)用一次,需要使用到c++的call_once機(jī)制,于是寫(xiě)一個(gè)小demo來(lái)測(cè)試,就因?yàn)檫@個(gè)足夠小發(fā)現(xiàn)了一個(gè)非常有意思的問(wèn)題。

call_once,基本原理

std::call_once 的內(nèi)部實(shí)現(xiàn)基于兩個(gè)重要的組件:std::once_flag 和 std::invoke。std::once_flag 是一個(gè)標(biāo)志,用于表示某個(gè)函數(shù)是否已經(jīng)被調(diào)用過(guò)。而 std::invoke 則負(fù)責(zé)實(shí)際調(diào)用該函數(shù)。

call_once的基本工作原理是:使用 std::once_flag 來(lái)標(biāo)記函數(shù)是否被調(diào)用過(guò)。當(dāng)有多個(gè)線程試圖調(diào)用 std::call_once 時(shí),只有一個(gè)線程會(huì)執(zhí)行函數(shù),其他線程會(huì)被阻塞直至該函數(shù)執(zhí)行完畢。

std::call_once 的使用步驟三步曲:

  • 創(chuàng)建 std::once_flag 對(duì)象:在需要保證函數(shù)只調(diào)用一次的地方創(chuàng)建一個(gè) std::once_flag 對(duì)象。
  • 編寫(xiě)需要執(zhí)行一次的函數(shù):編寫(xiě)你想要確保只調(diào)用一次的函數(shù)。
  • 調(diào)用 std::call_once:在需要執(zhí)行該函數(shù)的地方調(diào)用 std::call_once 并傳入 std::once_flag 和函數(shù)名稱。

demo問(wèn)題引入

demo非常簡(jiǎn)單,實(shí)現(xiàn)一個(gè)Init函數(shù)進(jìn)行call_once調(diào)用,只調(diào)用一次的函數(shù)Initialize做一次打印處理,main中連續(xù)調(diào)用Init 4次,理論上來(lái)說(shuō)我們執(zhí)行結(jié)果只有一行打印,這也是我們的目的。

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

std::once_flag flag;

void Initialize()
{
        std::cout << "Run into Initialize.." << std::endl;
}

void Init()
{
        std::call_once(flag, Initialize);
}

int main(){
    Init();
    Init();
    Init();
    Init();

    return 0;
}

使用g++編譯,執(zhí)行結(jié)果發(fā)現(xiàn)出錯(cuò)了:

拋出了個(gè)異常,從call_once上的理解來(lái)說(shuō)代碼實(shí)現(xiàn)應(yīng)該是沒(méi)問(wèn)題的。于是使用調(diào)試大法gdb,編譯+g后使用gdb調(diào)試發(fā)現(xiàn)了個(gè)有意思的:

使用gdb調(diào)試發(fā)現(xiàn)__gthread_active_ptr指針是0,然后繼續(xù)執(zhí)行發(fā)現(xiàn)___gthread_once返回的__e為0,于是繼續(xù)執(zhí)行if就拋了異常。__gthread_active_ptr這又是什么呢?

深入研究研究

怎么看呢?既然不知道是什么我一般的操作是先看預(yù)處理部分代碼,使用gcc -E參數(shù)來(lái)編譯出call_once.i文件。

g++ -E call_once.cpp -o call_once.i

打開(kāi)call_once.i文件我發(fā)現(xiàn)main函數(shù)部分沒(méi)有什么特別之處,我們搜索call_once可以看到它的實(shí)現(xiàn)。

這段代碼中的 std::call_once 函數(shù)首先創(chuàng)建了一個(gè)可調(diào)用對(duì)象 __callable,這個(gè)對(duì)象會(huì)調(diào)用傳入的函數(shù) __f,并傳入 __args 參數(shù)。然后,它將 __callable 的地址存儲(chǔ)到 __once_callable 變量中。

接下來(lái),通過(guò)一個(gè) lambda 表達(dá)式將 __callable 的調(diào)用封裝在 __once_call 中,這個(gè) lambda 表達(dá)式會(huì)執(zhí)行 __callable。

最后,使用底層線程庫(kù)的 __gthread_once 函數(shù)來(lái)確保 __once_call 只會(huì)執(zhí)行一次,即保證傳入的函數(shù) __f 只會(huì)被調(diào)用一次。

如果 __gthread_once 的返回值不為零,表示執(zhí)行出現(xiàn)了錯(cuò)誤,會(huì)通過(guò) __throw_system_error 拋出系統(tǒng)錯(cuò)誤。

既然是if(__e)后拋的異常,我們繼續(xù)看__gthread_once的實(shí)現(xiàn),搜索__gthread_once關(guān)鍵字,找到其實(shí)現(xiàn):

 11452 static inline int
 11453 __gthread_once (__gthread_once_t *__once, void (*__func) (void))
 11454 {
 11455   if (__gthread_active_p ())
 11456     return __gthrw_pthread_once (__once, __func);
 11457   else
 11458     return -1;
 11459 }

這個(gè)函數(shù)可以看到執(zhí)行了__gthread_active_p ,我們繼續(xù)找__gthread_active_p 的實(shí)現(xiàn)。

__gthread_active_p 是一個(gè)內(nèi)聯(lián)函數(shù),返回一個(gè)整數(shù)值。

static void const __gthread_active_ptr 是一個(gè)靜態(tài)指針常量,初始化為 __gthrw___pthread_key_create 函數(shù)的地址。

extension 是一個(gè) GNU C 擴(kuò)展,用于告知編譯器避免對(duì)某些表達(dá)式進(jìn)行警告。在此處,它將地址轉(zhuǎn)換為 void類型,以避免類型不匹配的警告。

&__gthrw___pthread_key_create 可能是一個(gè)特定線程庫(kù)(如 POSIX 線程庫(kù))內(nèi)部的函數(shù),用于創(chuàng)建線程特定數(shù)據(jù)的關(guān)鍵字。

函數(shù)返回 __gthread_active_ptr != 0,即如果該指針?lè)强眨瑒t表明線程已激活(從指針命名上猜的)。

所以該函數(shù)用于指示線程是否被激活。不明白?我們繼續(xù)看__gthrw___pthread_key_create的定義。

11405 static __typeof(pthread_key_create) __gthrw___pthread_key_create __attribute__ ((__weakref__("__pthread_key_create")));

通過(guò) attribute((weakref("__pthread_key_create"))),將 __gthrw___pthread_key_create 弱引用到 __pthread_key_create。

弱引用是一種機(jī)制,允許在鏈接過(guò)程中,如果存在 __pthread_key_create 的定義,則使用它。但如果找不到 __pthread_key_create,則允許 __gthrw___pthread_key_create 仍然存在,只不過(guò)它將保持為空或未定義狀態(tài)。

這里大致就明白了,總結(jié)一下,call_once內(nèi)部實(shí)現(xiàn)中要找一個(gè)__pthread_key_create定義,如果不存在則返回空,即我們調(diào)試的時(shí)的指針給了0,從而引起異常。__pthread_key_create函數(shù)很明顯是線程函數(shù)。好,那我們?cè)诖a中加上該函數(shù)調(diào)用試試看。在main開(kāi)始增加如下:

int main(){
    pthread_key_t key;
    pthread_key_create(&key, NULL);
    Init();

編譯運(yùn)行:

達(dá)到預(yù)期效果了!

所以整體分析一下,在 call_once 的內(nèi)部實(shí)現(xiàn)中,檢測(cè)是否支持 __pthread_key_create 可能是為了確保在使用 call_once 進(jìn)行線程同步時(shí),能夠利用線程特定數(shù)據(jù)鍵來(lái)管理狀態(tài)或資源,確保其正確性和性能。如果當(dāng)前環(huán)境不支持 __pthread_key_create,那么在多線程環(huán)境下可能無(wú)法有效地管理線程特定的狀態(tài)信息。

因此,檢測(cè)是否支持 __pthread_key_create 可能是 call_once 實(shí)現(xiàn)中的一種策略,用于在可能的情況下提供更好的線程安全性和性能。如果當(dāng)前環(huán)境不支持這個(gè)特定的功能,可能會(huì)采用其他方式來(lái)實(shí)現(xiàn) call_once,或者簡(jiǎn)化其行為以確保程序在這樣的環(huán)境中仍能正確運(yùn)行,盡管可能會(huì)犧牲一些特定的功能或性能。

我嘗試不使用__pthread_key_create,隨便調(diào)用一個(gè)pthread庫(kù)的api,比如pthread_create,或者pthread_mutex_init,調(diào)用可以全部傳遞空指針,結(jié)果依然是可以達(dá)到預(yù)期的。所以驗(yàn)證也說(shuō)明call_once內(nèi)部通過(guò)弱引用庫(kù)函數(shù)來(lái)檢測(cè)當(dāng)前是否支持多線程,如果不支持則拋出異常,所以使用前提必須是多線程環(huán)境。

總結(jié)

call_once 的魅力與注意事項(xiàng):

std::call_once 提供了一種簡(jiǎn)單而又強(qiáng)大的多線程同步方式,但在使用時(shí)也需注意一些細(xì)節(jié)。比如一定要確保程序是多線程調(diào)用,如果有多線程自然還要確保線程安全,避免潛在的死鎖和競(jìng)態(tài)條件問(wèn)題登。

責(zé)任編輯:趙寧寧 來(lái)源: 囧囧妹
相關(guān)推薦

2018-06-24 16:39:28

Tomcat異常線程

2020-12-12 13:50:16

云開(kāi)發(fā)

2021-01-27 13:54:05

開(kāi)發(fā)云原生工具

2024-05-20 01:10:00

Promise變量

2009-08-26 17:53:31

C# DropDown

2023-05-15 09:16:18

CSSCSS Mask

2011-06-22 09:43:01

C++

2024-03-18 08:14:07

SpringDAOAppConfig

2022-03-21 10:21:50

jQuery代碼模式

2020-03-10 14:59:16

oracle數(shù)據(jù)庫(kù)監(jiān)聽(tīng)異常

2009-02-16 19:33:09

2021-03-25 06:12:55

SVG 濾鏡CSS

2012-05-22 10:12:59

jQuery

2021-04-19 10:47:11

NettyDemoI

2022-06-15 07:21:47

鼠標(biāo)指針交互效果CSS

2022-08-15 22:34:47

Overflow方向裁切

2023-11-28 12:19:49

C++函數(shù)指針

2021-02-20 16:01:26

Github前端開(kāi)發(fā)

2015-03-12 10:46:30

代碼代碼犯罪

2022-05-20 07:36:02

LiveTerm工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产激情小视频在线| 国产精品免费无遮挡无码永久视频| 久久免费精品| 天涯成人国产亚洲精品一区av| 精品乱码一区二区三区| 天天爱天天做天天爽| 天天久久综合| 亚洲国产精品久久| 日本超碰在线观看| 欧美日韩在线视频免费观看| 久久久青草青青国产亚洲免观| 成人黄色av网| 欧美另类一区二区| 欧美精品一级| 在线亚洲国产精品网| 中文字幕视频观看| 日韩欧美专区| 欧美性开放视频| 欧美大片免费播放| 黄色在线网站| 粉嫩av亚洲一区二区图片| 国产精品你懂得| 日韩精品一区二区三| 99久久久久久中文字幕一区| 精品亚洲aⅴ在线观看| 日本一二三四区视频| 激情开心成人网| 亚洲国产综合人成综合网站| 亚洲一区不卡在线| 国产一区二区三区不卡在线| 粉嫩久久99精品久久久久久夜| 国产精品亚洲欧美导航| 青青青国产在线| 欧美全黄视频| 另类少妇人与禽zozz0性伦| 亚洲区自拍偷拍| 台湾佬综合网| 亚洲国产精品网站| 国产伦理在线观看| 国产在线不卡一区二区三区| 欧美午夜片在线观看| 青青青国产在线观看| 丰乳肥臀在线| 一二三四区精品视频| av磁力番号网| 老司机午夜在线视频| 中文字幕av一区二区三区高| 欧洲亚洲一区二区三区四区五区| 日韩av免费观影| 99国产精品久久久久久久久久| 岛国一区二区三区高清视频| 亚洲av无码国产精品久久不卡| 九九**精品视频免费播放| 国产精品午夜一区二区欲梦| 中文字幕91爱爱| 琪琪一区二区三区| 国产欧洲精品视频| 中文字幕免费观看视频| 日本在线不卡一区| 国产精品亚发布| 国产一区二区视频免费观看 | 国产aⅴ综合色| 7777精品伊久久久大香线蕉语言| 精品久久久无码中文字幕| 狠狠久久亚洲欧美| 99c视频在线| 亚洲奶汁xxxx哺乳期| 成人手机在线视频| 精品日韩欧美| 国产高清自拍视频在线观看| 国产精品天美传媒| 日本一本草久p| 久草在线资源站资源站| 天天综合色天天| 久久精品网站视频| 日本免费在线一区| 日韩一区二区三区电影在线观看 | 给我免费播放片在线观看| 国产传媒在线| 欧美天堂一区二区三区| 99中文字幕在线| 精品国产导航| 在线精品国产欧美| 精品人妻伦九区久久aaa片| 亚洲手机视频| 国产国语videosex另类| 国产特级黄色片| aaa亚洲精品| 亚洲韩国在线| 欧美大胆的人体xxxx| 色哟哟一区二区在线观看| 亚洲精品午夜在线观看| 136国产福利精品导航网址应用| 亚洲精品成人久久久| 在线看片中文字幕| 亚洲国产导航| 国产精品一区二区三区久久久| 超碰人人人人人人| 久久九九99视频| 乱熟女高潮一区二区在线| 亚洲国产福利| 日韩欧美一区二区在线视频| 成人片黄网站色大片免费毛片| 亚洲啊v在线观看| 亚州av一区二区| 国产精品自偷自拍| 久久久久国产精品麻豆| 日韩成人午夜影院| 全球最大av网站久久| 亚洲精品一区二区三区影院| 欧美性受xxxx黑人| 亚洲精品社区| 91传媒视频在线观看| 国产永久免费高清在线观看 | 91在线播放网址| 97超碰人人爱| 日韩一区二区三区免费视频| 精品爽片免费看久久| 中文字幕另类日韩欧美亚洲嫩草| 奶水喷射视频一区| 精品国产一区二区三区日日嗨| 伊人在线视频| 欧洲精品一区二区三区在线观看| 日韩精品视频一区二区| 中文一区一区三区免费在线观看| 国产精品大陆在线观看| 水莓100在线视频| 亚洲综合免费观看高清完整版| 色乱码一区二区三区在线| 美女毛片一区二区三区四区| 欧美激情国产精品| 99视频免费看| 亚洲欧美一区二区视频| 久久国产精品国产精品| 国产一区不卡| 日韩av高清不卡| 日韩二区三区| 色综合激情久久| 不卡一区二区在线观看| 在线视频观看日韩| 国产精品日韩一区二区三区| 中文字幕中文字幕在线十八区| 欧美日韩在线三级| 一级特黄曰皮片视频| 日韩成人伦理电影在线观看| 久久精品日产第一区二区三区乱码| 福利在线导航136| 亚洲国产成人一区| 97久久久久久久| wwww国产精品欧美| 日本www高清视频| 蜜臀91精品国产高清在线观看| 2023亚洲男人天堂| 日av在线播放| 色婷婷综合久久久中文字幕| 新91视频在线观看| 琪琪一区二区三区| 一区二区三区四区五区精品 | 日韩视频在线你懂得| 四虎精品免费视频| 国产成人精品影视| 成人免费观看cn| 欧美极品中文字幕| 国产欧美日韩精品在线观看| 在线毛片网站| 日韩免费看网站| 日韩精品一卡二卡| 国产婷婷一区二区| www.51色.com| 一区二区亚洲精品| 欧美黑人3p| 青青在线精品| 久久99精品久久久久久青青91| 中文乱码人妻一区二区三区视频| 天天躁日日躁aaaa视频| 久久动漫网址| 日本中文字幕久久看| 最近高清中文在线字幕在线观看| 3d成人动漫网站| 久久精品视频6| 久久精品人人做人人爽97 | 久久精品久久综合| 热久久最新地址| 亚洲色图美女| 亚洲影视九九影院在线观看| 国产不卡人人| 色一情一乱一区二区| 丰满人妻一区二区三区免费视频| 欧美日韩亚洲一区二区| 91狠狠综合久久久| av高清不卡在线| 蜜桃福利午夜精品一区| 中文在线不卡| 中文字幕一区二区三区最新| 久久91在线| 成人午夜高潮视频| 亚洲美女久久精品| 欧美剧在线观看| av黄色在线观看| 亚洲福利在线播放| 国产精品久久久久久免费| 天天av天天翘天天综合网色鬼国产| 99久久99久久精品免费看小说.| 福利91精品一区二区三区| 九九视频精品在线观看| 日韩午夜精品| 亚洲成人动漫在线| 精品高清在线| 精品视频一区在线| 精品亚洲a∨一区二区三区18| 日本久久久久久久久| 欧美卡一卡二| 深夜成人在线观看| 精品欧美不卡一区二区在线观看| 日韩视频免费观看高清在线视频| 国产午夜无码视频在线观看| 天天色 色综合| 久久午夜无码鲁丝片| 国产精品女同一区二区三区| 成人免费毛片日本片视频| 国产精品一区三区| 亚洲精品久久久中文字幕| 国产日韩欧美三区| 国产a级片网站| 黄色欧美日韩| 日韩精品免费一区| 91精品国产乱码久久久久久| 午夜精品一区二区在线观看的| 色综合久久中文| 精品无码久久久久国产| 高清日韩中文字幕| 国产精品免费一区二区三区在线观看 | 日日噜噜夜夜狠狠| 久久精品官网| 免费无码国产v片在线观看| 激情久久五月| 国产av国片精品| 国模 一区 二区 三区| 国产成人生活片| 夜间精品视频| 喜爱夜蒲2在线| 国产一区久久| 99在线精品免费视频| 伊人久久大香线蕉av超碰演员| 久操手机在线视频| 97久久夜色精品国产| 日本一区二区免费高清视频| 91成人影院| 路边理发店露脸熟妇泻火| 欧美三级免费| 国产二区视频在线| 99riav国产精品| 国产肥臀一区二区福利视频| 老鸭窝毛片一区二区三区| 成人观看免费完整观看| 美女久久一区| 欧美三级午夜理伦三级富婆| 久久超碰97中文字幕| 在线播放av中文字幕| 国产精品99久久久久久有的能看| 乳色吐息在线观看| 丁香桃色午夜亚洲一区二区三区| 一级黄色电影片| 91免费视频网址| 国产精品久久免费观看| 国产精品家庭影院| 免费人成在线观看| 欧美日韩在线视频首页| 亚洲国产精品无码久久久| 欧美日韩视频在线观看一区二区三区 | 鲁丝一区二区三区免费| 成人av二区| 精品嫩模一区二区三区| 国产亚洲高清视频| 国产三级日本三级在线播放| 精品一区二区三区免费播放| 免费黄色av网址| 国产欧美视频一区二区三区| 欧美色视频一区二区三区在线观看| 一区二区三区在线观看国产| 午夜影院在线看| 欧美日韩电影一区| 国产综合无码一区二区色蜜蜜| 亚洲欧洲xxxx| 成人在线免费看黄| 热99精品只有里视频精品| 香蕉久久一区| 国产在线精品一区二区三区》| 国产一区二区三区四区五区传媒 | 丁香花在线影院| 国产精品69av| 9l亚洲国产成人精品一区二三| 欧美另类网站| 欧美精品国产一区二区| 人妻有码中文字幕| 国产成人av资源| 奇米网一区二区| 精品福利视频导航| 国产欧美久久久| 亚洲欧美日韩中文在线| 日本动漫理论片在线观看网站| 日本成人免费在线| 一区二区日韩| 在线视频不卡一区二区三区| 国产精品最新自拍| 性生活在线视频| 国产精品亲子乱子伦xxxx裸| 日韩精品久久久久久久酒店| 337p亚洲精品色噜噜| 免费看男男www网站入口在线| 欧美日韩第一视频| 小说区图片区亚洲| 日韩欧美在线观看强乱免费| 国产欧美在线| 国产大尺度视频| 亚洲欧美精品午睡沙发| 国产精品第6页| 精品小视频在线| 麻豆免费在线| 成人自拍视频网站| 欧美aa国产视频| 在线视频日韩欧美| 国产精品美女久久久久aⅴ| 久久久精品福利| 亚洲第一级黄色片| 男女免费观看在线爽爽爽视频| 91精品久久久久久久久久久久久久 | 久久九九99| 亚洲国产欧美视频| 亚洲风情在线资源站| 国产成人免费看一级大黄| 日韩视频免费看| 日本在线一区二区| 亚洲高清视频一区| 日本网站在线观看一区二区三区| 日韩精品卡通动漫网站| 精品久久久久久久久久| 天天干天天草天天射| 欧美精品激情在线| 风间由美性色一区二区三区四区| 免费的一级黄色片| 国产91综合网| 国产精品30p| 亚洲精品www| 竹内纱里奈兽皇系列在线观看| 国语精品中文字幕| 亚洲欧美日韩综合国产aⅴ| 亚洲激情 欧美| 懂色av一区二区三区| 香蕉久久一区二区三区| 欧美亚洲在线视频| 欧美猛男同性videos| www.xxx亚洲| 中文幕一区二区三区久久蜜桃| 91国内精品视频| 久久99国产精品自在自在app | 亚洲国产毛片完整版| 高端美女服务在线视频播放| 你懂的视频在线一区二区| 日精品一区二区| 国产成人精品视频免费| 欧美一区二区三区视频免费播放| 91亚洲天堂| 国产美女在线精品免费观看| 国产日韩1区| 欧洲性xxxx| 日韩一级成人av| 91在线超碰| 日韩电影免费观看高清完整| 久久av老司机精品网站导航| 亚洲熟女www一区二区三区| 亚洲精品一区在线观看| 欧美性理论片在线观看片免费| 亚洲一区二区三区加勒比| 国产一区在线观看麻豆| 国产精品7777| 一区二区三区在线播放欧美| 高清久久精品| 久久久999视频| 国产精品视频看| 黄色av小说在线观看| 国产精品99久久久久久www| 91久久高清国语自产拍| 波多野结衣加勒比| 欧美综合久久久| 欧美一卡二卡| 日本欧美精品久久久| 国产黄人亚洲片| 日本免费精品视频| 久久久久成人精品| 精品欧美久久| 超碰caoprom| 欧美老肥妇做.爰bbww| 9lporm自拍视频区在线| 亚洲高清在线观看一区| 国产91高潮流白浆在线麻豆| 波多野结衣理论片| 久久久久亚洲精品国产| 日韩精品一区二区久久| xxxx黄色片|