溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

線(xiàn)程安全與可重入函數(shù)的區(qū)別有哪些

發(fā)布時(shí)間:2021-10-21 14:03:27 來(lái)源:億速云 閱讀:151 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)線(xiàn)程安全與可重入函數(shù)的區(qū)別有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

輕量級(jí)進(jìn)程(LWP)是計(jì)算機(jī)操作系統(tǒng)中一種實(shí)現(xiàn)多任務(wù)的方法。

在計(jì)算機(jī)操作系統(tǒng)中,輕量級(jí)進(jìn)程(LWP)是一種實(shí)現(xiàn)多任務(wù)的方法。與普通進(jìn)程相比,LWP與其他進(jìn)程共享所有(或大部分)它的邏輯地址空間和系統(tǒng)資源;與線(xiàn)程相比,LWP有它自己的進(jìn)程標(biāo)識(shí)符,優(yōu)先級(jí),狀態(tài),以及棧和局部存儲(chǔ)區(qū),并和其他進(jìn)程有著父子關(guān)系;這是和類(lèi)Unix操作系統(tǒng)的系統(tǒng)調(diào)用vfork()生成的進(jìn)程一樣的。另外,線(xiàn)程既可由應(yīng)用程序管理,又可由內(nèi)核管理,而LWP只能由內(nèi)核管理并像普通進(jìn)程一樣被調(diào)度。Linux內(nèi)核是支持LWP的典型例子。

在大多數(shù)系統(tǒng)中,LWP與普通進(jìn)程的區(qū)別也在于它只有一個(gè)最小的執(zhí)行上下文和調(diào)度程序所需的統(tǒng)計(jì)信息,而這也是它之所以被稱(chēng)為輕量級(jí)的原因。一般來(lái)說(shuō),一個(gè)進(jìn)程代表程序的一個(gè)實(shí)例,而LWP代表程序的執(zhí)行線(xiàn)程(其實(shí),在內(nèi)核不支持線(xiàn)程的時(shí)候,LWP可以很方便地提供線(xiàn)程的實(shí)現(xiàn))。因?yàn)橐粋€(gè)執(zhí)行線(xiàn)程不像進(jìn)程那樣需要那么多狀態(tài)信息,所以L(fǎng)WP也不帶有這樣的信息。

LWP的一個(gè)重要作用是提供了一個(gè)用戶(hù)級(jí)線(xiàn)程實(shí)現(xiàn)的中間系統(tǒng)。LWP可以通過(guò)系統(tǒng)調(diào)用獲得內(nèi)核提供的服務(wù),因此,當(dāng)一個(gè)用戶(hù)級(jí)線(xiàn)程運(yùn)行時(shí),只需要將它連接到一個(gè)LWP上便可以具有內(nèi)核支持線(xiàn)程的所有屬性。

各線(xiàn)程還共享以下進(jìn)程資源和環(huán)境:
1. 文件描述符表
2. 每種信號(hào)的處理方式(SIG_IGN、 SIG_DFL或者自定義的信號(hào)處理函數(shù))
3. 當(dāng)前工作目錄
4. 用戶(hù)id和組id

但有些資源是每個(gè)線(xiàn)程各有一份的:
1. 線(xiàn)程id
2. 上下文,包括各種寄存器的值、程序計(jì)數(shù)器和棧指針
3. ??臻g
4. errno變量
5. 信號(hào)屏蔽字
6. 調(diào)度優(yōu)先級(jí)

進(jìn)程強(qiáng)調(diào)獨(dú)占,而線(xiàn)程強(qiáng)調(diào)共享。線(xiàn)程私有最重要的是:硬件上下文,棧幀。

多個(gè)線(xiàn)程看見(jiàn)公共資源,如果不保護(hù),則會(huì)發(fā)生異常,線(xiàn)程安全(一個(gè)線(xiàn)程修改會(huì)影響另一個(gè)線(xiàn)程執(zhí)行邏輯異常)。

產(chǎn)生線(xiàn)程安全本質(zhì):線(xiàn)程共享資源,造成一定影響。

同一個(gè)進(jìn)程內(nèi)部另一個(gè)執(zhí)行流:信號(hào)處理

線(xiàn)程安全:

       線(xiàn)程安全函數(shù):在C語(yǔ)言中局部變量是在棧中分配的,任何未使用靜態(tài)數(shù)據(jù)或其他共享資源的函數(shù)都是線(xiàn)程安全的。而使用全局變量的函數(shù)是非線(xiàn)程安全的。
       使用靜態(tài)數(shù)據(jù)或其他共享資源的函數(shù),必須通過(guò)加鎖的方式來(lái)使函數(shù)實(shí)現(xiàn)線(xiàn)程安全。

       線(xiàn)程安全的:
                   如果一個(gè)函數(shù)在同一時(shí)刻可以被多個(gè)線(xiàn)程安全地調(diào)用,就稱(chēng)該函數(shù)是線(xiàn)程安全的。
                   線(xiàn)程安全函數(shù)解決多個(gè)線(xiàn)程調(diào)用函數(shù)時(shí)訪(fǎng)問(wèn)共享資源的沖突問(wèn)題。

可重入:

  1. 函數(shù)被不同的控制流程調(diào)用,有可能在第一次調(diào)用還沒(méi)返回時(shí)就再次進(jìn)入該函 數(shù),這稱(chēng)為重入。

  2. 訪(fǎng)問(wèn)時(shí)有可能因?yàn)橹厝攵斐慑e(cuò)亂,像這樣的函數(shù)稱(chēng)為 不可重入函數(shù),反之,如果一個(gè)函數(shù)只訪(fǎng)問(wèn)自己的局部變量或參數(shù),則稱(chēng)為可重入函數(shù)。

3..可重入函數(shù)特點(diǎn): 函數(shù)可以由多于一個(gè)線(xiàn)程并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯(cuò)誤??芍厝牒瘮?shù)可以在任意時(shí)刻被中斷,稍后再繼續(xù)運(yùn)行,不會(huì)丟失數(shù)據(jù)??芍?入性解決函數(shù)運(yùn)行結(jié)果的確定性和可重復(fù)性。 所謂可重入函數(shù)是指一個(gè)可以被多個(gè)任務(wù)調(diào)用的過(guò)程,任務(wù)在調(diào)用時(shí)不必?fù)?dān)心數(shù)據(jù)是否會(huì)出錯(cuò)。

可重入函數(shù)編寫(xiě)規(guī)范為:

1、不在函數(shù)內(nèi)部使用靜態(tài)或全局?jǐn)?shù)據(jù) 
2、不返回靜態(tài)或全局?jǐn)?shù)據(jù),所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。 
3、使用本地?cái)?shù)據(jù),或者通過(guò)制作全局?jǐn)?shù)據(jù)的本地拷貝來(lái)保護(hù)全局?jǐn)?shù)據(jù)。
4、如果必須訪(fǎng)問(wèn)全局變量,利用互斥機(jī)制來(lái)保護(hù)全局變量。
5、不調(diào)用不可重入函數(shù)。

兩者之間的關(guān)系:
1、一個(gè)函數(shù)對(duì)于多個(gè)線(xiàn)程是可重入的,則這個(gè)函數(shù)是線(xiàn)程安全的。
2、一個(gè)函數(shù)是線(xiàn)程安全的,但并不一定是可重入的?!臼褂没コ怄i實(shí)現(xiàn)的線(xiàn)程安全】
3、可重入性要強(qiáng)于線(xiàn)程安全性。

注:可重入函數(shù)是指函數(shù)內(nèi)部沒(méi)有使用共享變量。可重入函數(shù)是線(xiàn)程安全函數(shù)的一個(gè)真子集。

C語(yǔ)言:可重入函數(shù)是說(shuō)當(dāng)一個(gè)函數(shù)被不同的線(xiàn)程同時(shí)訪(fǎng)問(wèn)的時(shí)候,每一個(gè)調(diào)用都獨(dú)自使用自己的一份數(shù)據(jù),多次調(diào)用之間不存在數(shù)據(jù)共享。所以說(shuō)C語(yǔ)言可重入的函數(shù)一定是線(xiàn)程安全的,因?yàn)楦揪筒淮嬖诙鄠€(gè)線(xiàn)程共享一份數(shù)據(jù)問(wèn)題,就不會(huì)發(fā)生訪(fǎng)問(wèn)沖突。可重入函數(shù)的要求是函數(shù)不訪(fǎng)問(wèn)全局或靜態(tài)變量。

線(xiàn)程安全如果多個(gè)線(xiàn)程對(duì)同一個(gè)函數(shù)的多次調(diào)用之間存在共享數(shù)據(jù),所有對(duì)共享數(shù)據(jù)的訪(fǎng)問(wèn)都必須是序列化的,每個(gè)線(xiàn)程按先來(lái)后到排隊(duì)訪(fǎng)問(wèn),也就是不存在同時(shí)訪(fǎng)問(wèn)。

C++中:類(lèi)的成員函數(shù)可重入是說(shuō):類(lèi)的成員函數(shù)在被多個(gè)線(xiàn)程在不同實(shí)例里面訪(fǎng)問(wèn)(每個(gè)線(xiàn)程一個(gè)實(shí)例)時(shí),不存在共享數(shù)據(jù),也不會(huì)有數(shù)據(jù)沖突。

類(lèi)的可重入表示類(lèi)的所有成員函數(shù)都是可重入的。
類(lèi)的線(xiàn)程安全是說(shuō):類(lèi)的同一個(gè)實(shí)例被多個(gè)線(xiàn)程訪(fǎng)問(wèn)的時(shí)候,對(duì)數(shù)據(jù)的操縱是序列化的,不會(huì)有訪(fǎng)問(wèn)沖突。

兩者之間的區(qū)別:

1.可重入概念只和函數(shù)訪(fǎng)問(wèn)的變量類(lèi)型有關(guān),和是否使用鎖沒(méi)有關(guān)系。
2.而線(xiàn)程安全和鎖的使用關(guān)系密切,很多時(shí)候線(xiàn)程安全是靠鎖來(lái)保證的。

關(guān)于“線(xiàn)程安全與可重入函數(shù)的區(qū)別有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI