真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

線程安全與可重入函數(shù)-創(chuàng)新互聯(lián)

  1. 定義

    創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來(lái)公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過(guò)去的十年時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如銅雕雕塑等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過(guò)硬的技術(shù)實(shí)力獲得客戶的一致贊譽(yù)。

    (1).線程安全函數(shù):一般說(shuō)來(lái),一個(gè)函數(shù)被稱為線程安全的,當(dāng)它被多個(gè)并發(fā)線程反復(fù)調(diào)用時(shí),它會(huì)一直產(chǎn)生正確的結(jié)果。

    (2).可重入:程序執(zhí)行到某個(gè)函數(shù)foo()時(shí),收到信號(hào),于是暫停目前正在執(zhí)行的函數(shù),轉(zhuǎn)到信號(hào)處理函數(shù),而這個(gè)信號(hào)處理函數(shù)的執(zhí)行過(guò)程中,又恰恰也會(huì)進(jìn)入到剛剛執(zhí)行的函數(shù)foo(),這樣便發(fā)生了所謂的重入。此時(shí)如果foo()能夠正確的運(yùn)行,而且處理完成后,之前暫停的foo()也能夠正確運(yùn)行,則說(shuō)明它是可重入的。

    (3).拓展:

    1).如果一個(gè)函數(shù)中用到了全局或靜態(tài)變量,那么它不是線程安全的,也不是可重入的;

    2).如果我們對(duì)它加以改進(jìn),在訪問(wèn)全局或靜態(tài)變量時(shí)使用互斥量或信號(hào)量等方式加鎖,則可以使它變成線程安全的,但此時(shí)它仍然是不可重入的,因?yàn)橥ǔ<渔i方式是針對(duì)不同線程的訪問(wèn),而對(duì)同一線程可能出現(xiàn)問(wèn)題;

    3).如果將函數(shù)中的全局或靜態(tài)變量去掉,改成函數(shù)參數(shù)等其他形式,則有可能使函數(shù)變成既線程安全,又可重入。

  2. 聯(lián)系

    可重入函數(shù)是線程安全函數(shù)的一個(gè)真子集。即可重入函數(shù)是線程安全函數(shù),但是反過(guò)來(lái),線程安全函數(shù)未必是可重入函數(shù)。

  3. 區(qū)別

    (1)解決問(wèn)題:

    a.可重入函數(shù)要解決的問(wèn)題是,不在函數(shù)內(nèi)部使用靜態(tài)或全局?jǐn)?shù)據(jù),不返回靜態(tài)或全局?jǐn)?shù)據(jù),也不調(diào)用不可重入函數(shù)。

    b.線程安全函數(shù)要解決的問(wèn)題是,多個(gè)線程調(diào)用函數(shù)時(shí)訪問(wèn)資源沖突。

    (2)確保措施

 a.確保線程安全的措施是:線程安全函數(shù)不使用共享數(shù)據(jù)(全局、靜態(tài)或堆)或者對(duì)共享數(shù)據(jù)實(shí)施同步機(jī)制保護(hù)。

 b.保障可重入的措施:不共享數(shù)據(jù)并且不調(diào)用不可重入函數(shù)。

  (1)不要使用static變量和全局變量,堅(jiān)持只用局部變量;

    (2)若必須訪問(wèn)全局變量,利用互斥信號(hào)量來(lái)保護(hù)全局變量;

    (3)獲取得知哪些系統(tǒng)調(diào)用是可重入的,在多任務(wù)處理程序中都使用安全的系統(tǒng)調(diào)用;

    (4)不調(diào)用其它任何不可重入的函數(shù);

    (5)謹(jǐn)慎使用堆棧malloc/new。

 (3)轉(zhuǎn)化

  函數(shù)如果使用靜態(tài)變量,通過(guò)加鎖后可以轉(zhuǎn)成線程安全函數(shù),但仍然有可能不是可重入的,比如   strtok。strtok是既不可重入的,也不是線程安全的。加鎖的strtok不是可重入的,但線程安全。而   strtok_r既是可重入的,也是線程安全的。

 (4)在信號(hào)處理函數(shù)被調(diào)用

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

值得一提的是POSIX 1003.1的Syste m Interface缺省是線程安全的,但不是異步信號(hào)安全的。異步信號(hào)安全的需要明確表示,比如fork ()和signal()。

 b. 一個(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)用中都被覆蓋重寫(xiě)。

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

4. 函數(shù)的線程不安全與不可重入的原因

(1)任何線程不安全問(wèn)題的根源都是“共享數(shù)據(jù)”。所以,不使用任何共享數(shù)據(jù)的函數(shù)(即:可重入函  數(shù))肯定是線程安全的。

(2)不可重入函數(shù)的原因在于:

 a. 已知它們使用靜態(tài)數(shù)據(jù)結(jié)構(gòu)
 b. 它們調(diào)用malloc和free.
 因?yàn)閙alloc通常會(huì)為所分配的存儲(chǔ)區(qū)維護(hù)一個(gè)鏈接表,而插入執(zhí)行信號(hào)處理函數(shù)的時(shí)候,進(jìn)程可能正  在修改此鏈接表。
 c. 它們是標(biāo)準(zhǔn)IO函數(shù).
 因?yàn)闃?biāo)準(zhǔn)IO庫(kù)的很多實(shí)現(xiàn)都使用了全局?jǐn)?shù)據(jù)結(jié)構(gòu)

(3)線程安全函數(shù)不一定是可重入函數(shù),因?yàn)榧词褂芯€程有共享數(shù)據(jù),線程被并發(fā)調(diào)用的時(shí)候也可以使  其結(jié)果正確--通過(guò)同步操作保證正確性。

共享數(shù)據(jù)可以是:

  1. 函數(shù)把返回結(jié)果放到一個(gè)公共的位置

  2. 由調(diào)用者傳入的線程間共享的指針變量或者引用變量

  3. 函數(shù)內(nèi)部本來(lái)就會(huì)使用的共享靜態(tài)變量

4. 補(bǔ)充

(1)常見(jiàn)的不可重入函數(shù)有:
printf --------引用全局變量stdout
malloc --------全局內(nèi)存分配表
free   --------全局內(nèi)存分配表

(2)不可重入的解決方舉例(printf)

例如,程序正在調(diào)用printf輸出,但是在調(diào)用printf時(shí),出現(xiàn)了信號(hào),對(duì)應(yīng)的信號(hào)處理函數(shù)也有printf語(yǔ)句,就會(huì)導(dǎo)致兩個(gè)printf的輸出混雜在一起。
如果是給printf加鎖的話,同樣是上面的情況就會(huì)導(dǎo)致死鎖。對(duì)于這種情況,采用的方法一般是在特定的區(qū)域屏蔽一定的信號(hào)。
屏蔽信號(hào)的方法:
1> signal(SIGPIPE, SIG_IGN); //忽略一些信號(hào)
2> sigprocmask()
sigprocmask只為單線程定義的
3> pthread_sigmask()
pthread_sigmasks可以在多線程中使用

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文名稱:線程安全與可重入函數(shù)-創(chuàng)新互聯(lián)
地址分享:http://weahome.cn/article/egppo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部