色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何理解線程安全?

Linux大陸 ? 來源:Linux大陸 ? 2023-05-08 15:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是LinuxZn。

本次分享線程安全的基礎(chǔ)知識。

線程安全

在多線程編程中,線程安全是必須要考慮的因素。

什么是線程安全?

在多線程環(huán)境中,多個線程在同一時刻對同一份資源進(jìn)行寫操作時,不會出現(xiàn)數(shù)據(jù)不一致。反之,則是線程非安全的。

線程安全是程序設(shè)計中的術(shù)語,指某個函數(shù)、函數(shù)庫在多線程環(huán)境中被調(diào)用時,能夠正確地處理多個線程之間的公用變量,使程序功能正確完成。

為了確保在多線程環(huán)境中的線程安全,就要確保數(shù)據(jù)的一致性。確保線程安全的幾種方法:

使用互斥鎖

一個線程,如果需要訪問公共資源,需要獲得互斥鎖并對其加鎖,資源在在鎖定過程中,如果其它線程對其進(jìn)行訪問,也需要獲得互斥鎖,如果獲取不到,線程只能進(jìn)行阻塞,直到獲得該鎖的線程解鎖。關(guān)于互斥鎖的使用:Hello系列 | 多線程編程基礎(chǔ)!

例子(來源:維基百科):

#include

intincrement_counter(void)
{
staticintcounter=0;
staticpthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_lock(&mutex);

//onlyallowonethreadtoincrementatatime
++counter;
//storevaluebeforeanyotherthreadsincrementitfurther
intresult=counter;

pthread_mutex_unlock(&mutex);

returnresult;
}

這個函數(shù)是線程安全的,可以在多個線程中被調(diào)用。

使用原子操作

上面的例子中,使用一個 互斥鎖來保護(hù)一次簡單的增量操作顯然過于昂貴,我們可以使用一些專門的原子操作API函數(shù)來替代。如上述例子,c++11中的原子變量提供了一個可使此函數(shù)既線程安全又可重入(而且還更簡潔)的替代方案:

#include

intincrement_counter(void)
{
staticstd::atomiccounter(0);

//incrementisguaranteedtobedoneatomically
intresult=++counter;

returnresult;
}

Linux內(nèi)核中原子整形操作:

#include

intincrement_counter(void)
{
atomic_tcounter=ATOMIC_INIT(0);

//incrementisguaranteedtobedoneatomically
atomic_inc(&counter);
intresult=counter;

returnresult;
}

什么是原子操作?

從字面上簡單理解,原子是一種很微小的粒子;原子操作是不能再進(jìn)一步細(xì)分的操作。

從上面互斥鎖的例子來看,在線程層面,線程1和線程2同時調(diào)用了increment_counter函數(shù),被 mutex 保護(hù)的操作是原子操作,lock、unlock及保護(hù)部分要整體順序運(yùn)行,不可再進(jìn)一步細(xì)分,作為一個原子存在 。

如果確定某個操作是原子的,并且有原子操作API函數(shù)可以使用,就不用為了去保護(hù)這個操作而加上會耗費(fèi)昂貴性能開銷的鎖。

如,Linux內(nèi)核原子整形操作 API 函數(shù)表(來源:正點(diǎn)原子) :

95134a9a-ecf0-11ed-90ce-dac502259ad0.png

防止過度優(yōu)化

線程安全的函數(shù)應(yīng)該為每個調(diào)用它的線程分配專門的空間,把多個線程共享的變量正確對待(如,通知編譯器該變量為“易失(volatile)”型,阻止其進(jìn)行一些不恰當(dāng)?shù)膬?yōu)化)。

線程安全函數(shù)與可重入函數(shù)?

先明確概念:

線程安全函數(shù):能夠正確地處理多個線程之間的公用變量的函數(shù)。、

可重入函數(shù):在任意時刻被中斷然后操作系統(tǒng)調(diào)度執(zhí)行另一段代碼,這段代碼又使用了該副程序不會出錯。

可重入函數(shù)應(yīng)當(dāng)滿足條件:

不能含有靜態(tài)(全局)非常量數(shù)據(jù)。

不能返回靜態(tài)(全局)非常量數(shù)據(jù)的地址。

只能處理由調(diào)用者提供的數(shù)據(jù)。

不能依賴于單例模式資源的鎖。

調(diào)用(call)的函數(shù)也必需是可重入的。

可重入函數(shù)未必是線程安全的;線程安全函數(shù)未必是可重入的。

例子1:上述例子中的increment_counter函數(shù)是線程安全的,但是并不是可重入的。因為使用了互斥鎖,如果這個函數(shù)用在可重入的中斷處理程序中,如果在pthread_mutex_lock(&mutex)和pthread_mutex_unlock(&mutex)之間產(chǎn)生另一個調(diào)用函數(shù)increment_counter的中斷,則會第二次執(zhí)行此函數(shù),此時由于mutex已被lock,函數(shù)會在pthread_mutex_lock(&mutex)處阻塞,并且由于mutex沒有機(jī)會被unlock,阻塞會永遠(yuǎn)持續(xù)下去。

例子2:一個函數(shù)打開某個文件并讀入數(shù)據(jù)。這個函數(shù)是可重入的,因為它的多個實(shí)例同時執(zhí)行不會造成沖突;但它不是線程安全的,因為在它讀入文件時可能有別的線程正在修改該文件,為了線程安全必須對文件加“同步鎖”。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95330
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    906

    瀏覽量

    42854
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4383

    瀏覽量

    64999
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75397
  • 線程安全
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    2556

原文標(biāo)題:如何理解線程安全?

文章出處:【微信號:Linux大陸,微信公眾號:Linux大陸】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    不同創(chuàng)建線程安全Set的方式

    線程安全的問題,真的算是老生常談了。這幾天看到一個 HashSet 線程安全的騷操作,在這里分享給大家。 在本文中,我們將分享如何構(gòu)造線程
    的頭像 發(fā)表于 09-25 14:20 ?1014次閱讀

    線程安全注意事項

    線程安全是指多個線程同時訪問或修改共享資源時,能夠保證程序的正確性和可靠性。 開發(fā)者選擇TaskPool或Worker進(jìn)行多線程開發(fā)時,在TaskPool和Worker的工作
    發(fā)表于 06-20 07:49

    調(diào)用非安全線程的dll的問題

    在調(diào)用非線程安全的dll時,是不是要選擇在UI線程中運(yùn)行?是不是還必須用不可重入的子VI封裝一下?上述的兩步是不是都要做?這些問題不是很清楚,還請各位大神指點(diǎn)一下
    發(fā)表于 03-14 21:13

    Linux下的線程安全是什么

    Linux下的線程安全原文結(jié)構(gòu)有點(diǎn)亂線程安全:多個執(zhí)行流對臨界資源進(jìn)行爭搶訪問,而不會造成數(shù)據(jù)二義性和邏輯混亂,成這段代碼的過程是線程
    發(fā)表于 07-01 13:34

    什么是線程安全?如何去實(shí)現(xiàn)線程安全

    什么是線程安全?如何去實(shí)現(xiàn)線程安全?互斥實(shí)現(xiàn)的技術(shù)是什么?有哪些注意事項?同步實(shí)現(xiàn)的技術(shù)是什么?其操作流程有哪些?
    發(fā)表于 07-23 09:57

    請教大神rtthread中的ringbuff是線程安全的嗎

    最近想用輕量級的ringbuff,請教大神rtthread中的ringbuff是線程安全的嗎?
    發(fā)表于 07-29 10:44

    什么是線程安全

    線程安全的鏈表-隊列-棧,就是多線程同時操作(包括查找、添加、刪除等)鏈表、隊列或棧,無論如何操作,就是多線程同時操作(包括查找、添加、刪除等)鏈表、隊列或棧,無論如何操作,都不會產(chǎn)生
    發(fā)表于 11-17 11:16 ?1次下載

    解決線程安全問題技巧匯總

    線程,有時被稱為輕量級進(jìn)程,是程序執(zhí)行流的最小單元。一個標(biāo)準(zhǔn)的線程線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進(jìn)程中的一個實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位
    發(fā)表于 12-01 13:42 ?1638次閱讀

    什么是線程安全 如何實(shí)現(xiàn)線程安全代碼

    相信有很多同學(xué)在面對多線程代碼時都會望而生畏,認(rèn)為多線程代碼就像一頭難以馴服的怪獸,你制服不了這頭怪獸它就會反過來吞噬你。
    的頭像 發(fā)表于 05-17 12:45 ?1857次閱讀

    理解析:線程池中多余的線程是如何回收的?

    最近閱讀了JDK線程池ThreadPoolExecutor的源碼,對線程池執(zhí)行任務(wù)的流程有了大體了解,實(shí)際上這個流程也十分通俗易懂,就不再贅述了,別人寫的比我好多了。
    的頭像 發(fā)表于 11-11 09:57 ?1166次閱讀

    什么是線程安全?如何理解線程安全

    在多線程編程中,線程安全是必須要考慮的因素。
    的頭像 發(fā)表于 05-30 14:33 ?2482次閱讀
    什么是<b class='flag-5'>線程</b><b class='flag-5'>安全</b>?如何<b class='flag-5'>理解</b><b class='flag-5'>線程</b><b class='flag-5'>安全</b>?

    線程安全怎么辦

    線程安全一直是多線程開發(fā)中需要注意的地方,可以說,并發(fā)安全保證了所有的數(shù)據(jù)都安全。 1 線程
    的頭像 發(fā)表于 10-10 15:00 ?589次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>安全</b>怎么辦

    如何知道你的代碼是否線程安全

    在并發(fā)編程時,如果多個線程訪問同一資源,我們需要保證訪問的時候不會產(chǎn)生沖突,數(shù)據(jù)修改不會發(fā)生錯誤,這就是我們常說的 線程安全 。 那什么情況下,訪問數(shù)據(jù)時是安全的?什么情況下,訪問數(shù)據(jù)
    的頭像 發(fā)表于 11-01 11:42 ?1041次閱讀
    如何知道你的代碼是否<b class='flag-5'>線程</b><b class='flag-5'>安全</b>

    redis多線程還能保證線程安全

    Redis是一種使用C語言編寫的高性能鍵值存儲系統(tǒng),它是單線程的,因為使用了多路復(fù)用的方式來處理并發(fā)請求。這樣的實(shí)現(xiàn)方式帶來了很好的性能,但同時也引發(fā)了一些線程安全方面的問題。 在Redis中,由于
    的頭像 發(fā)表于 12-05 10:28 ?2281次閱讀

    摩爾線程正式開源音頻理解大模型MooER

    近日,國內(nèi)領(lǐng)先的GPU創(chuàng)新企業(yè)摩爾線程宣布了一項重大技術(shù)突破——正式開源其自主研發(fā)的音頻理解大模型MooER(摩耳)。這一舉動標(biāo)志著我國在音頻處理與理解領(lǐng)域邁出了堅實(shí)的一步,特別是在基于國產(chǎn)硬件的AI模型研發(fā)上取得了顯著成就。
    的頭像 發(fā)表于 08-27 15:24 ?936次閱讀
    主站蜘蛛池模板: 老板吻我下身好爽到高潮 | 网红主播 国产精品 开放90后 | 亚洲第一伊人 | 久久伊人天堂视频网 | 亚洲欧美国产旡码专区 | 嫩草影院在线观看精品视频 | 欧美zzzoooxxx | 国产AV天堂亚洲AV麻豆 | 尤蜜网站在线进入免费 | 免费中文字幕视频 | 征服艳妇后宫春色 | 久久亚洲人成国产精品 | 99久久人妻无码精品系列性欧美 | 在线免费观看日本 | 小小水蜜桃视频高清在线播放 | 国产剧情福利AV一区二区 | 国产高清美女一级a毛片久久w | 九九热视频免费观看 | 九色PORNY丨视频入口 | 毛片免费在线播放 | 成人在线观看视频免费 | 亚洲国产日韩欧美高清片a 亚洲国产日韩a精品乱码 | 少妇两个奶头喷出奶水了怎么办 | 亚洲视频国产在线精品 | 久久久无码精品亚洲A片软件 | 女王羞辱丨vk | 十分钟免费观看高清视频大全 | 午夜福利电影 | 国产亚洲高清视频 | 好看的电影网站亚洲一区 | 有人在线观看的视频吗免费 | 国产人妻麻豆蜜桃色 | 99这里只有是精品2 99这里有精品视频视频 | 亚洲精品卡2卡3卡4卡5卡区 | 69成人免费视频 | 麻豆AV福利AV久久AV | 免费看美女的网站 | 中文字幕在线视频在线看 | 国产一区二区内射最近更新 | 蜜桃婷婷狠狠久久综合9色 蜜桃视频一区二区 | 日本高清二区 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品