這篇文章將為大家詳細(xì)講解有關(guān)線程安全與可重入函數(shù)的區(qū)別有哪些,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營銷成為有效果、有回報(bào)的無錫營銷推廣。成都創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設(shè)十余年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。
輕量級進(jìn)程(LWP)是計(jì)算機(jī)操作系統(tǒng)中一種實(shí)現(xiàn)多任務(wù)的方法。
在計(jì)算機(jī)操作系統(tǒng)中,輕量級進(jìn)程(LWP)是一種實(shí)現(xiàn)多任務(wù)的方法。與普通進(jìn)程相比,LWP與其他進(jìn)程共享所有(或大部分)它的邏輯地址空間和系統(tǒng)資源;與線程相比,LWP有它自己的進(jìn)程標(biāo)識符,優(yōu)先級,狀態(tài),以及棧和局部存儲區(qū),并和其他進(jìn)程有著父子關(guān)系;這是和類Unix操作系統(tǒng)的系統(tǒng)調(diào)用vfork()生成的進(jìn)程一樣的。另外,線程既可由應(yīng)用程序管理,又可由內(nèi)核管理,而LWP只能由內(nèi)核管理并像普通進(jìn)程一樣被調(diào)度。Linux內(nèi)核是支持LWP的典型例子。
在大多數(shù)系統(tǒng)中,LWP與普通進(jìn)程的區(qū)別也在于它只有一個最小的執(zhí)行上下文和調(diào)度程序所需的統(tǒng)計(jì)信息,而這也是它之所以被稱為輕量級的原因。一般來說,一個進(jìn)程代表程序的一個實(shí)例,而LWP代表程序的執(zhí)行線程(其實(shí),在內(nèi)核不支持線程的時候,LWP可以很方便地提供線程的實(shí)現(xiàn))。因?yàn)橐粋€執(zhí)行線程不像進(jìn)程那樣需要那么多狀態(tài)信息,所以LWP也不帶有這樣的信息。
LWP的一個重要作用是提供了一個用戶級線程實(shí)現(xiàn)的中間系統(tǒng)。LWP可以通過系統(tǒng)調(diào)用獲得內(nèi)核提供的服務(wù),因此,當(dāng)一個用戶級線程運(yùn)行時,只需要將它連接到一個LWP上便可以具有內(nèi)核支持線程的所有屬性。
各線程還共享以下進(jìn)程資源和環(huán)境:
1. 文件描述符表
2. 每種信號的處理方式(SIG_IGN、 SIG_DFL或者自定義的信號處理函數(shù))
3. 當(dāng)前工作目錄
4. 用戶id和組id
但有些資源是每個線程各有一份的:
1. 線程id
2. 上下文,包括各種寄存器的值、程序計(jì)數(shù)器和棧指針
3. ??臻g
4. errno變量
5. 信號屏蔽字
6. 調(diào)度優(yōu)先級
進(jìn)程強(qiáng)調(diào)獨(dú)占,而線程強(qiáng)調(diào)共享。線程私有最重要的是:硬件上下文,棧幀。
多個線程看見公共資源,如果不保護(hù),則會發(fā)生異常,線程安全(一個線程修改會影響另一個線程執(zhí)行邏輯異常)。
產(chǎn)生線程安全本質(zhì):線程共享資源,造成一定影響。
同一個進(jìn)程內(nèi)部另一個執(zhí)行流:信號處理
線程安全:
線程安全函數(shù):在C語言中局部變量是在棧中分配的,任何未使用靜態(tài)數(shù)據(jù)或其他共享資源的函數(shù)都是線程安全的。而使用全局變量的函數(shù)是非線程安全的。
使用靜態(tài)數(shù)據(jù)或其他共享資源的函數(shù),必須通過加鎖的方式來使函數(shù)實(shí)現(xiàn)線程安全。
線程安全的:
如果一個函數(shù)在同一時刻可以被多個線程安全地調(diào)用,就稱該函數(shù)是線程安全的。
線程安全函數(shù)解決多個線程調(diào)用函數(shù)時訪問共享資源的沖突問題。
可重入:
函數(shù)被不同的控制流程調(diào)用,有可能在第一次調(diào)用還沒返回時就再次進(jìn)入該函 數(shù),這稱為重入。
訪問時有可能因?yàn)橹厝攵斐慑e亂,像這樣的函數(shù)稱為 不可重入函數(shù),反之,如果一個函數(shù)只訪問自己的局部變量或參數(shù),則稱為可重入函數(shù)。
3..可重入函數(shù)特點(diǎn): 函數(shù)可以由多于一個線程并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯誤??芍厝牒瘮?shù)可以在任意時刻被中斷,稍后再繼續(xù)運(yùn)行,不會丟失數(shù)據(jù)。可重 入性解決函數(shù)運(yùn)行結(jié)果的確定性和可重復(fù)性。 所謂可重入函數(shù)是指一個可以被多個任務(wù)調(diào)用的過程,任務(wù)在調(diào)用時不必?fù)?dān)心數(shù)據(jù)是否會出錯。
可重入函數(shù)編寫規(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ù),或者通過制作全局?jǐn)?shù)據(jù)的本地拷貝來保護(hù)全局?jǐn)?shù)據(jù)。
4、如果必須訪問全局變量,利用互斥機(jī)制來保護(hù)全局變量。
5、不調(diào)用不可重入函數(shù)。
兩者之間的關(guān)系:
1、一個函數(shù)對于多個線程是可重入的,則這個函數(shù)是線程安全的。
2、一個函數(shù)是線程安全的,但并不一定是可重入的?!臼褂没コ怄i實(shí)現(xiàn)的線程安全】
3、可重入性要強(qiáng)于線程安全性。
注:可重入函數(shù)是指函數(shù)內(nèi)部沒有使用共享變量。可重入函數(shù)是線程安全函數(shù)的一個真子集。
C語言:可重入函數(shù)是說當(dāng)一個函數(shù)被不同的線程同時訪問的時候,每一個調(diào)用都獨(dú)自使用自己的一份數(shù)據(jù),多次調(diào)用之間不存在數(shù)據(jù)共享。所以說C語言可重入的函數(shù)一定是線程安全的,因?yàn)楦揪筒淮嬖诙鄠€線程共享一份數(shù)據(jù)問題,就不會發(fā)生訪問沖突??芍厝牒瘮?shù)的要求是函數(shù)不訪問全局或靜態(tài)變量。
線程安全如果多個線程對同一個函數(shù)的多次調(diào)用之間存在共享數(shù)據(jù),所有對共享數(shù)據(jù)的訪問都必須是序列化的,每個線程按先來后到排隊(duì)訪問,也就是不存在同時訪問。
C++中:類的成員函數(shù)可重入是說:類的成員函數(shù)在被多個線程在不同實(shí)例里面訪問(每個線程一個實(shí)例)時,不存在共享數(shù)據(jù),也不會有數(shù)據(jù)沖突。
類的可重入表示類的所有成員函數(shù)都是可重入的。
類的線程安全是說:類的同一個實(shí)例被多個線程訪問的時候,對數(shù)據(jù)的操縱是序列化的,不會有訪問沖突。
兩者之間的區(qū)別:
1.可重入概念只和函數(shù)訪問的變量類型有關(guān),和是否使用鎖沒有關(guān)系。
2.而線程安全和鎖的使用關(guān)系密切,很多時候線程安全是靠鎖來保證的。
關(guān)于“線程安全與可重入函數(shù)的區(qū)別有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。