国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux 可重入、異步信號(hào)安全和線程安全

這篇具有很好參考價(jià)值的文章主要介紹了Linux 可重入、異步信號(hào)安全和線程安全。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

可重入函數(shù)

當(dāng)一個(gè)被捕獲的信號(hào)被一個(gè)進(jìn)程處理時(shí),進(jìn)程執(zhí)行的普通的指令序列會(huì)被一個(gè)信號(hào)處理器暫時(shí)地中斷。它首先執(zhí)行該信號(hào)處理程序中的指令。如果從信號(hào)處理程序返回(例如沒有調(diào)用exit或longjmp),則繼續(xù)執(zhí)行在捕獲到信號(hào)時(shí)進(jìn)程正在執(zhí)行的正常指令序列(這和當(dāng)一個(gè)硬件中斷發(fā)生時(shí)所發(fā)生的事情相似)。但是在信號(hào)處理器里,我們并不知道當(dāng)信號(hào)被捕獲時(shí)進(jìn)程正在執(zhí)行哪里的代碼。如果進(jìn)程正使用malloc在它的堆上分配額外的內(nèi)存,而此時(shí)由于捕捉到信號(hào)而插入執(zhí)行該信號(hào)處理程序,其中又調(diào)用了malloc,這會(huì)發(fā)生什么呢?或者,如果進(jìn)程正調(diào)用一個(gè)把結(jié)果存儲(chǔ)在一個(gè)靜態(tài)區(qū)域里的函數(shù)到一半,比如 getpwnam,而我們?cè)谛盘?hào)處理器里調(diào)用相同的函數(shù),又會(huì)發(fā)生什么呢?在malloc的例子里,進(jìn)程可能會(huì)遭到嚴(yán)重破壞,因?yàn)閙alloc通常維護(hù)它 所有分配過的區(qū)域的鏈表,而插入執(zhí)行信號(hào)處理程序時(shí),進(jìn)程可能正在更改此鏈接表。在getpwnam的例子里,返回給普通調(diào)用者的信息可能被返回給信號(hào)處理器的信息覆蓋。

SUS規(guī)定了必須保證是可以再入的函數(shù)。下表列出了這些再入函數(shù):

Linux 可重入、異步信號(hào)安全和線程安全,linux,運(yùn)維,服務(wù)器,Linux內(nèi)核

一個(gè)可重入的函數(shù)簡(jiǎn)單來說就是可以被中斷的函數(shù),也就是說,可以在這個(gè)函數(shù)執(zhí)行的任何時(shí)刻中斷它,轉(zhuǎn)入OS 調(diào)度下去執(zhí)行另外一段代碼,而返回控制時(shí)不會(huì)出現(xiàn)什么錯(cuò)誤。可重入(reentrant)函數(shù)可以由多于一個(gè)任務(wù)并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯(cuò)誤。相反, 不可重入(non-reentrant)函數(shù)不能由超過一個(gè)任務(wù)所共享,除非能確保函數(shù)的互斥 (或者使用信號(hào)量,或者在代碼的關(guān)鍵部分禁用中斷)。可重入函數(shù)可以在任意時(shí)刻被中斷, 稍后再繼續(xù)運(yùn)行,不會(huì)丟失數(shù)據(jù)??芍厝牒瘮?shù)要么使用本地變量,要么在使用全局變量時(shí) 保護(hù)自己的數(shù)據(jù)。信號(hào)安全,其實(shí)也就是異步信號(hào)安全,是說線程在信號(hào)處理函數(shù)當(dāng)中,不管以任何方式調(diào)用你的這個(gè)函數(shù)如果不死鎖不修改數(shù)據(jù),那就是信號(hào)安全的。因此,我認(rèn)為可重入與異步信號(hào)安全是一個(gè)概念 。

線程安全

線程安全:一個(gè)函數(shù)被稱為線程安全的,當(dāng)且僅當(dāng)被多個(gè)并發(fā)線程反復(fù)的調(diào)用時(shí),它會(huì)一直產(chǎn)生正確的結(jié)果。有一類重要的線程安全函數(shù),叫做可重入函數(shù),其特點(diǎn)在于它們具有一種屬性:當(dāng)它們被多個(gè)線程調(diào)用時(shí),不會(huì)引用任何共享的數(shù)據(jù)。盡管線程安全和可重入有時(shí)會(huì)( 不正確的 )被用做同義詞,但是它們之間還是有清晰的技術(shù)差別的。可重入函數(shù)是線程安全函數(shù)的一個(gè)真子集。

可重入與線程安全的區(qū)別及聯(lián)系

可重入函數(shù):重入即表示重復(fù)進(jìn)入,首先它意味著這個(gè)函數(shù)可以被中斷,其次意味著它除了使用自己棧上的變量以外不依賴于任何環(huán)境(包括static ),這樣的函數(shù)就是purecode (純代碼)可重入,可以允許有該函數(shù)的多個(gè)副本在運(yùn)行,由于它們使用的是分離的棧,所以不會(huì)互相干擾??芍厝牒瘮?shù)是線程安全函數(shù),但是反過來,線程安全函數(shù)未必是可重入函數(shù)。實(shí)際上,可重入函數(shù)很少,APUE 10.6 節(jié)中描述了Single UNIX Specification 說明的可重入的函數(shù),只有115 個(gè);APUE 12.5 節(jié)中描述了POSIX.1 中不能保證線程安全的函數(shù),只有89 個(gè)。信號(hào)就像硬件中斷一樣,會(huì)打斷正在執(zhí)行的指令序列。信號(hào)處理函數(shù)無法判斷捕獲到信號(hào)的時(shí)候,進(jìn)程在何處運(yùn)行。如果信號(hào)處理函數(shù)中的操作與打斷的函數(shù)的操作相同,而且這個(gè)操作中有靜態(tài)數(shù)據(jù)結(jié)構(gòu)等,當(dāng)信號(hào)處理函數(shù)返回的時(shí)候(當(dāng)然這里討論的是信號(hào)處理函數(shù)可以返回),恢復(fù)原先的執(zhí)行序列,可能會(huì)導(dǎo)致信號(hào)處理函數(shù)中的操作覆蓋了之前正常操作中的數(shù)據(jù)。

不可重入的幾種情況

使用靜態(tài)數(shù)據(jù)結(jié)構(gòu),比如getpwnam,getpwuid:如果信號(hào)發(fā)生時(shí)正在執(zhí)行g(shù)etpwnam,信號(hào)處理程序中執(zhí)行g(shù)etpwnam可能覆蓋原來getpwnam獲取的舊值

  • 調(diào)用malloc或free:如果信號(hào)發(fā)生時(shí)正在malloc(修改堆上存儲(chǔ)空間的鏈接表),信號(hào)處理程序又調(diào)用malloc,會(huì)破壞內(nèi)核的數(shù)據(jù)結(jié)構(gòu)
  • 使用標(biāo)準(zhǔn)IO函數(shù),因?yàn)楹枚鄻?biāo)準(zhǔn)IO的實(shí)現(xiàn)都使用全局?jǐn)?shù)據(jù)結(jié)構(gòu),比如printf(文件偏移是全局的)
  • 函數(shù)中調(diào)用longjmp或siglongjmp:信號(hào)發(fā)生時(shí)程序正在修改一個(gè)數(shù)據(jù)結(jié)構(gòu),處理程序返回到另外一處,導(dǎo)致數(shù)據(jù)被部分更新。

即使對(duì)于可重入函數(shù),在信號(hào)處理函數(shù)中使用也需要注意一個(gè)問題就是errno 。一個(gè)線程中只有一個(gè)errno 變量,信號(hào)處理函數(shù)中使用的可重入函數(shù)也有可能 會(huì)修改errno 。例如,read 函數(shù)是可重入的,但是它也有可能會(huì)修改errno 。因此,正確的做法是在信號(hào)處理函數(shù)開始,先保存errno ;在信號(hào)處 理函數(shù)退出的時(shí)候,再恢復(fù)errno 。例如,程序正在調(diào)用printf 輸出,但是在調(diào)用printf 時(shí),出現(xiàn)了信號(hào),對(duì)應(yīng)的信號(hào)處理函數(shù)也有printf 語句,就會(huì)導(dǎo)致兩個(gè)printf 的輸出混雜在一起。如果是給printf 加鎖的話,同樣是上面的情況就會(huì)導(dǎo)致死鎖。對(duì)于這種情況,采用的方法一般是在特定的區(qū)域屏蔽一定的信號(hào)。

屏蔽信號(hào)的方法:

signal(SIGPIPE, SIG_IGN); // 忽略一些信號(hào)
sigprocmask();// sigprocmask 只為單線程定義的
pthread_sigmask(); // pthread_sigmasks 可以在多線程中使用

現(xiàn)在看來信號(hào)異步安全和可重入的限制似乎是一樣的,所以這里把它們等同看待;

線程安全:如果一個(gè)函數(shù)在同一時(shí)刻可以被多個(gè)線程安全的調(diào)用,就稱該函數(shù)是線程安全的。Malloc 函數(shù)是線程安全的。不需要共享時(shí),請(qǐng)為每個(gè)線程提供一個(gè)專用的數(shù)據(jù)副本。如果共享非常重要,則提供顯式同步,以確保程序以確定的方式操作。通過將過程包含在語句中來鎖定和解除鎖定互斥,可以使不安全過程變成線程安全過程,而且可以進(jìn)行串行化。很多函數(shù)并不是線程安全的,因?yàn)樗麄兎祷氐臄?shù)據(jù)是存放在靜態(tài)的內(nèi)存緩沖區(qū)中的。通過修改接口,由調(diào)用者自行提供緩沖區(qū)就可以使這些函數(shù)變?yōu)榫€程安全的。操作系統(tǒng)實(shí)現(xiàn)支持線程安全函數(shù)的時(shí)候,會(huì)對(duì)POSIX.1 中的一些非線程安全的函數(shù)提供一些可替換的線程安全版本。例如,gethostbyname() 是線程不安全的,在Linux 中提供了gethostbyname_r() 的線程安全實(shí)現(xiàn)。函數(shù)名字后面加上 _r ,以表明這個(gè)版本是可重入的(對(duì)于線程可重入,也就是說是線程安全的,但并不是說對(duì)于信號(hào)處理函數(shù)也是可重入的,或者是異步信號(hào)安全的)。多線程程序中常見的疏忽性問題:

  • 將指針作為新線程的參數(shù)傳遞給調(diào)用方棧。
  • 在沒有同步機(jī)制保護(hù)的情況下訪問全局內(nèi)存的共享可更改狀態(tài)。
  • 兩個(gè)線程嘗試輪流獲取對(duì)同一對(duì)全局資源的權(quán)限時(shí)導(dǎo)致死鎖。其中一個(gè)線程控制第一種資源,另一個(gè)線程控制第二種資源。其中一個(gè)線程放棄之前,任何一個(gè)線程都無法繼續(xù)操作。
  • 嘗試重新獲取已持有的鎖(遞歸死鎖)。
  • 在同步保護(hù)中創(chuàng)建隱藏的間隔。如果受保護(hù)的代碼段包含的函數(shù)釋放了同步機(jī)制,而又在返回調(diào)用方之前重新獲取了該同步機(jī)制,則將在保護(hù)中出現(xiàn)此間隔。結(jié)果具有誤導(dǎo)性。對(duì)于調(diào)用方,表面上看全局?jǐn)?shù)據(jù)已受到保護(hù),而實(shí)際上未受到保護(hù)。
  • 將UNIX 信號(hào)與線程混合時(shí),使用sigwait(2) 模型來處理異步信號(hào)。
  • 調(diào)用setjmp(3C) 和longjmp(3C) ,然后長(zhǎng)時(shí)間跳躍,而不釋放互斥鎖。
  • 從對(duì)*_cond_wait() 或 *_cond_timedwait() 的調(diào)用中返回后無法重新評(píng)估條件。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-668633.html

??資料直通車:Linux內(nèi)核源碼技術(shù)學(xué)習(xí)路線+視頻教程內(nèi)核源碼

學(xué)習(xí)直通車:Linux內(nèi)核源碼內(nèi)存調(diào)優(yōu)文件系統(tǒng)進(jìn)程管理設(shè)備驅(qū)動(dòng)/網(wǎng)絡(luò)協(xié)議棧

總結(jié)

  • 判斷一個(gè)函數(shù)是不是可重入函數(shù),在于判斷其能否可以被打斷,打斷后恢復(fù)運(yùn)行能夠得到正確的結(jié)果。(打斷執(zhí)行的指令序列并不改變函數(shù)的數(shù)據(jù))
  • 判斷一個(gè)函數(shù)是不是線程安全的,在于判斷其能否在多個(gè)線程同時(shí)執(zhí)行其指令序列的時(shí)候,保證每個(gè)線程都能夠得到正確的結(jié)果。
  • 如果一個(gè)函數(shù)對(duì)多個(gè)線程來說是可重入的,則說這個(gè)函數(shù)是線程安全的,但這并不能說明對(duì)信號(hào)處理程序來說該函數(shù)也是可重入的。
  • 如果函數(shù)對(duì)異步信號(hào)處理程序的重入是安全的,那 么就可以說函數(shù)是” 異步-信號(hào)安全 ” 的。

可重入與線程安全是兩個(gè)獨(dú)立的概念, 都與函數(shù)處理資源的方式有關(guān)。首先,可重入和線程安全是兩個(gè)并不等同的概念,一個(gè)函數(shù)可以是可重入的,也可以是線程安全的,可以兩者均滿足,可以兩者皆不滿足( 該描述嚴(yán)格的說存在漏洞,參見第二條) 。其次,從集合和邏輯的角度看,可重入是線程安全的子集,可重入是線程安全的充分非必要條件??芍厝氲暮瘮?shù)一定是線程安全的,然過來則不成立。第三,POSIX 中對(duì)可重入和線程安全這兩個(gè)概念的定義:

  • Reentrant Function :A function whose effect, when called by two or more threads,is guaranteed to be as if the threads each executed thefunction one after another in an undefined order, even ifthe actual execution is interleaved.
  • Thread-Safe Function :A function that may be safely invoked concurrently by multiple threads.
  • Async-Signal-Safe Function :A function that may be invoked, without restriction fromsignal-catching functions. No function is async-signal -safe unless explicitly described as such

以上三者的關(guān)系為:可重入函數(shù) 必然 是 線程安全函數(shù) 和 異步信號(hào)安全函數(shù);線程安全函數(shù)不一定是可重入函數(shù)。

可重入與線程安全的區(qū)別體現(xiàn)在能否在signal 處理函數(shù)中被調(diào)用的問題上, 可重入函數(shù)在signal 處理函數(shù)中可以被安全調(diào)用,因此同時(shí)也是 Async-Signal-Safe Function ;而線程安全函數(shù)不保證可以在signal 處理函數(shù)中被安全調(diào)用,如果通過設(shè)置信號(hào)阻塞集合等方法保證一個(gè)非可重入函數(shù)不被信號(hào)中斷,那么它也是Async-Signal-Safe Function。

值得一提的是POSIX 1003.1 的 System Interface 缺省是 Thread-Safe 的,但不是Async-Signal-Safe 的。Async-Signal-Safe 的需要明確表示,比如fork () 和signal() 。

一個(gè)非可重入函數(shù)通常( 盡管不是所有情況下) 由它的外部接口和使用方法即可進(jìn)行判斷。例如:strtok() 是非可重入的,因?yàn)樗趦?nèi)部存儲(chǔ)了被標(biāo)記分割的字符串;ctime() 函數(shù)也是非可重入的,它返回一個(gè)指向靜態(tài)數(shù)據(jù)的指針,而該靜態(tài)數(shù)據(jù)在每次調(diào)用中都被覆蓋重寫。

一個(gè)線程安全的函數(shù)通過加鎖的方式來實(shí)現(xiàn)多線程對(duì)共享數(shù)據(jù)的安全訪問。線程安全這個(gè)概念,只與函數(shù)的內(nèi)部實(shí)現(xiàn)有關(guān),而不影響函數(shù)的外部接口。在 C 語言中,局部變量是在棧上分配的。因此,任何未使用靜態(tài)數(shù)據(jù)或其他共享資源的函數(shù)都是線程安全的。

目前的 AIX 版本中,以下函數(shù)庫(kù)是線程安全的:

  • C 標(biāo)準(zhǔn)函數(shù)庫(kù)
  • 與BSD 兼容的函數(shù)庫(kù)

使用全局變量( 的函數(shù)) 是非線程安全的。這樣的信息應(yīng)該以線程為單位進(jìn)行存儲(chǔ),這樣對(duì)數(shù)據(jù)的訪問就可以串行化。一個(gè)線程可能會(huì)讀取由另外一個(gè)線程生成的錯(cuò)誤代碼。在AIX 中,每個(gè)線程有獨(dú)立的errno 變量。

最后讓我們來構(gòu)想一個(gè)線程安全但不可重入的函數(shù):

假設(shè)函數(shù)func() 在執(zhí)行過程中需要訪問某個(gè)共享資源,因此為了實(shí)現(xiàn)線程安全,在使用該資源前加鎖,在不需要資源解鎖。

假設(shè)該函數(shù)在某次執(zhí)行過程中,在已經(jīng)獲得資源鎖之后,有異步信號(hào)發(fā)生,程序的執(zhí)行流轉(zhuǎn)交給對(duì)應(yīng)的信號(hào)處理函數(shù);再假設(shè)在該信號(hào)處理函數(shù)中也需要調(diào)用函數(shù) func() ,那么func() 在這次執(zhí)行中仍會(huì)在訪問共享資源前試圖獲得資源鎖,然而我們知道前一個(gè)func() 實(shí)例已然獲得該鎖,因此信號(hào)處理函數(shù)阻塞——另一方面,信號(hào)處理函數(shù)結(jié)束前被信號(hào)中斷的線程是無法恢復(fù)執(zhí)行的,當(dāng)然也沒有釋放資源的機(jī)會(huì),這樣就出現(xiàn)了線程和信號(hào)處理函數(shù)之間的死鎖局面。

因此,func() 盡管通過加鎖的方式能保證線程安全,但是由于函數(shù)體對(duì)共享資源的訪問,因此是非可重入。

原文作者:一起學(xué)嵌入式

Linux 可重入、異步信號(hào)安全和線程安全,linux,運(yùn)維,服務(wù)器,Linux內(nèi)核

?

到了這里,關(guān)于Linux 可重入、異步信號(hào)安全和線程安全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java入門-可重入鎖

    Java入門-可重入鎖

    什么是可重入鎖? 當(dāng)線程獲取某個(gè)鎖后,還可以繼續(xù)獲取它,可以遞歸調(diào)用,而不會(huì)發(fā)生死鎖; 可重入鎖案例 程序可重入加鎖 A.class,沒有發(fā)生死鎖。 sychronized鎖 運(yùn)行結(jié)果 ReentrantLock 運(yùn)行結(jié)果 如何保證可重入 當(dāng)一個(gè)線程訪問同步塊并獲取鎖時(shí),會(huì)在對(duì)象頭和棧幀中的鎖記錄里

    2024年02月22日
    瀏覽(26)
  • java~理解可重入鎖

    在Java中,可重入鎖(Reentrant Lock)是一種同步機(jī)制,允許線程在持有鎖的情況下再次獲取該鎖,而不會(huì)被自己所持有的鎖所阻塞。也就是說,一個(gè)線程可以多次獲得同一個(gè)鎖,而不會(huì)出現(xiàn)死鎖的情況。 可重入鎖在多線程編程中非常有用,它允許線程在訪問共享資源時(shí)多次獲取

    2024年02月09日
    瀏覽(25)
  • ReentrantLock是如何實(shí)現(xiàn)可重入性

    1 問題 ReentrantLock是如何實(shí)現(xiàn)可重入性的? 并且在進(jìn)入鎖內(nèi)之前進(jìn)行了哪些判斷? 2 方法 // Sync繼承于AQS abstract static class Sync extends AbstractQueuedSynchronizer { ?... } // ReentrantLock默認(rèn)是非公平鎖 public ReentrantLock() { ? ? ? ?sync = new NonfairSync(); } // 可以通過向構(gòu)造方法中傳true來實(shí)現(xiàn)公

    2024年02月07日
    瀏覽(24)
  • 并發(fā)編程之可重入鎖ReentrantLock

    并發(fā)編程之可重入鎖ReentrantLock

    大家都知道在并發(fā)編程中一般會(huì)用到多線程技術(shù),多線程技術(shù)可以大大增加系統(tǒng)QPS/TPS。但是在一些特殊的業(yè)務(wù)場(chǎng)景下我們需要限制線程的并發(fā)數(shù)目,比如秒殺系統(tǒng)、多種商品金額疊加運(yùn)算等等都是需要限制線程數(shù)量。特別是在分布式微服務(wù)架構(gòu),多線程同步問題尤為明顯。一

    2023年04月25日
    瀏覽(43)
  • curator實(shí)現(xiàn)的zookeeper可重入鎖

    Curator是一個(gè)Apache開源的ZooKeeper客戶端庫(kù),它提供了許多高級(jí)特性和工具類,用于簡(jiǎn)化在分布式環(huán)境中使用ZooKeeper的開發(fā)。其中之一就是可重入鎖。 Curator提供了 InterProcessMutex 類來實(shí)現(xiàn)可重入鎖。以下是使用Curator實(shí)現(xiàn)ZooKeeper可重入鎖的示例: import org.apache.curator.framework.Curato

    2024年02月15日
    瀏覽(19)
  • ReentrantLock原理--非公平鎖、可重入、可打斷性

    ReentrantLock原理--非公平鎖、可重入、可打斷性

    先從構(gòu)造器開始看,默認(rèn)為非公平鎖實(shí)現(xiàn) NonfairSync 繼承自 AQS 沒有競(jìng)爭(zhēng)時(shí) 第一個(gè)競(jìng)爭(zhēng)出現(xiàn)時(shí) Thread-1 執(zhí)行了 CAS 嘗試將 state 由 0 改為 1,結(jié)果失敗 進(jìn)入 tryAcquire 邏輯,這時(shí) state 已經(jīng)是1,結(jié)果仍然失敗 接下來進(jìn)入 addWaiter 邏輯,構(gòu)造 Node 隊(duì)列 圖中黃色三角表示該 Node 的 waitSt

    2023年04月08日
    瀏覽(22)
  • Redis分布式可重入鎖實(shí)現(xiàn)方案

    在單進(jìn)程環(huán)境下,要保證一個(gè)代碼塊的同步執(zhí)行,直接用 synchronized 或 ReetrantLock 即可。在分布式環(huán)境下,要保證多個(gè)節(jié)點(diǎn)的線程對(duì)代碼塊的同步訪問,就必須要用到分布式鎖方案。 分布式鎖實(shí)現(xiàn)方案有很多,有基于關(guān)系型數(shù)據(jù)庫(kù)行鎖實(shí)現(xiàn)的;有基于ZooKeeper臨時(shí)順序節(jié)

    2024年02月19日
    瀏覽(24)
  • Redisson 分布式鎖可重入的原理

    Redisson 分布式鎖可重入的原理

    目錄 1. 使用 Redis 實(shí)現(xiàn)分布式鎖存在的問題 2. Redisson 的分布式鎖解決不可重入問題的原理 不可重入:同一個(gè)線程無法兩次 / 多次獲取鎖 舉例 method1 執(zhí)行需要獲取鎖 method2 執(zhí)行也需要(同一把)鎖 如果 method1 中調(diào)用了 method2,就會(huì)出現(xiàn)死鎖的情況 method1 執(zhí)行的過程是同一個(gè)線

    2024年01月25日
    瀏覽(19)
  • 以太坊硬分叉后的可重入漏洞攻擊

    以太坊君士坦丁堡升級(jí)將降低部分 SSTORE 指令的 gas 費(fèi)用。然而,這次升級(jí)也有一個(gè)副作用,在 Solidity 語言編寫的智能合約中調(diào)用 address.transfer()函數(shù)或 address.send()函數(shù)時(shí)存在可重入漏洞。在目前版本的以太坊網(wǎng)絡(luò)中,這些函數(shù)被認(rèn)為是可重入安全的,但分叉后它們不再是了。

    2024年02月11日
    瀏覽(20)
  • 【redis】redis分布式鎖(二)可重入鎖+設(shè)計(jì)模式

    【redis】redis分布式鎖(二)可重入鎖+設(shè)計(jì)模式

    上一篇鏈接: 【redis】redis分布式鎖(一)手寫分布式鎖1.0~6.0 隱式鎖(即synchronized使用的鎖)默認(rèn)是可重入鎖 synchronized的重入實(shí)現(xiàn)機(jī)理 顯式鎖也有ReentrantLock這樣的可重入鎖 結(jié)論: 下邊將使用lua腳本的方式,把可重入鎖的案例語句原子化 V1.0版本 藍(lán)色部分是重復(fù)的,可

    2024年02月03日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包