chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

什么是線(xiàn)程安全?如何理解線(xiàn)程安全?

冬至子 ? 來(lái)源:Linux大陸 ? 作者:LinuxZn ? 2023-05-30 14:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

線(xiàn)程安全

在多線(xiàn)程編程中,線(xiàn)程安全是必須要考慮的因素。

什么是線(xiàn)程安全?

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

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

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

使用互斥鎖

一個(gè)線(xiàn)程,如果需要訪(fǎng)問(wèn)公共資源,需要獲得互斥鎖并對(duì)其加鎖,資源在在鎖定過(guò)程中,如果其它線(xiàn)程對(duì)其進(jìn)行訪(fǎng)問(wèn),也需要獲得互斥鎖,如果獲取不到,線(xiàn)程只能進(jìn)行阻塞,直到獲得該鎖的線(xiàn)程解鎖。

#include 

int increment_counter(void)
{
 static int counter = 0;
 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 pthread_mutex_lock(&mutex);
 
 // only allow one thread to increment at a time
 ++counter;
 // store value before any other threads increment it further
 int result = counter; 

 pthread_mutex_unlock(&mutex);
 
 return result;
}

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

使用原子操作

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

#include 

int increment_counter(void)
{
 static std::atomic<int> counter(0);
 
 // increment is guaranteed to be done atomically
 int result = ++counter;

 return result;
}

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

#include 

int increment_counter(void)
{
 atomic_t counter = ATOMIC_INIT(0);
 
 // increment is guaranteed to be done atomically
 atomic_inc(&counter);
 int result = counter;

 return result;
}

什么是原子操作?

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

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

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

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

圖片

防止過(guò)度優(yōu)化

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

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

先明確概念:

  • 線(xiàn)程安全函數(shù):能夠正確地處理多個(gè)線(xiàn)程之間的公用變量的函數(shù)。、
  • 可重入函數(shù):在任意時(shí)刻被中斷然后操作系統(tǒng)調(diào)度執(zhí)行另一段代碼,這段代碼又使用了該副程序不會(huì)出錯(cuò)。

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

  • 不能含有靜態(tài)(全局)非常量數(shù)據(jù)。
  • 不能返回靜態(tài)(全局)非常量數(shù)據(jù)的地址。
  • 只能處理由調(diào)用者提供的數(shù)據(jù)。
  • 不能依賴(lài)于單例模式資源的鎖。
  • 調(diào)用(call)的函數(shù)也必需是可重入的。

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

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

例子2:一個(gè)函數(shù)打開(kāi)某個(gè)文件并讀入數(shù)據(jù)。這個(gè)函數(shù)是可重入的,因?yàn)樗亩鄠€(gè)實(shí)例同時(shí)執(zhí)行不會(huì)造成沖突;但它不是線(xiàn)程安全的,因?yàn)樵谒x入文件時(shí)可能有別的線(xiàn)程正在修改該文件,為了線(xiàn)程安全必須對(duì)文件加“同步鎖”。

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

    關(guān)注

    1

    文章

    1669

    瀏覽量

    51057
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7578
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    318

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    線(xiàn)程安全注意事項(xiàng)

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

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

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

    YYKit源碼線(xiàn)程安全計(jì)數(shù)器YYSentinel

    YYKit源碼探究(八十三) —— 線(xiàn)程安全計(jì)數(shù)器YYSentinel(一)
    發(fā)表于 04-28 16:57

    Linux下的線(xiàn)程安全是什么

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

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

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

    請(qǐng)教大神rtthread中的ringbuff是線(xiàn)程安全的嗎

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

    什么是線(xiàn)程安全

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

    解決線(xiàn)程安全問(wèn)題技巧匯總

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

    java的線(xiàn)程安全、單例模式、JVM內(nèi)存結(jié)構(gòu)

    線(xiàn)程安全就是多線(xiàn)程訪(fǎng)問(wèn)時(shí),采用了加鎖機(jī)制,當(dāng)一個(gè)線(xiàn)程訪(fǎng)問(wèn)類(lèi)的某個(gè)數(shù)據(jù)時(shí),進(jìn)行保護(hù),其他線(xiàn)程不能進(jìn)行訪(fǎng)問(wèn)直到該
    發(fā)表于 03-12 10:30 ?0次下載

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

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

    如何理解線(xiàn)程安全?

    本次分享線(xiàn)程安全的基礎(chǔ)知識(shí)。
    的頭像 發(fā)表于 05-08 15:03 ?1237次閱讀
    如何<b class='flag-5'>理解</b><b class='flag-5'>線(xiàn)程</b><b class='flag-5'>安全</b>?

    線(xiàn)程安全怎么辦

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

    如何知道你的代碼是否線(xiàn)程安全

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

    redis多線(xiàn)程還能保證線(xiàn)程安全

    Redis是一種使用C語(yǔ)言編寫(xiě)的高性能鍵值存儲(chǔ)系統(tǒng),它是單線(xiàn)程的,因?yàn)槭褂昧硕嗦窂?fù)用的方式來(lái)處理并發(fā)請(qǐng)求。這樣的實(shí)現(xiàn)方式帶來(lái)了很好的性能,但同時(shí)也引發(fā)了一些線(xiàn)程安全方面的問(wèn)題。 在Redis中,由于
    的頭像 發(fā)表于 12-05 10:28 ?2543次閱讀