溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

線程安全與可重入函數的區別有哪些

發布時間:2021-10-21 14:03:27 來源:億速云 閱讀:178 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關線程安全與可重入函數的區別有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

輕量級進程(LWP)是計算機操作系統中一種實現多任務的方法。

在計算機操作系統中,輕量級進程(LWP)是一種實現多任務的方法。與普通進程相比,LWP與其他進程共享所有(或大部分)它的邏輯地址空間和系統資源;與線程相比,LWP有它自己的進程標識符,優先級,狀態,以及棧和局部存儲區,并和其他進程有著父子關系;這是和類Unix操作系統的系統調用vfork()生成的進程一樣的。另外,線程既可由應用程序管理,又可由內核管理,而LWP只能由內核管理并像普通進程一樣被調度。Linux內核是支持LWP的典型例子。

在大多數系統中,LWP與普通進程的區別也在于它只有一個最小的執行上下文和調度程序所需的統計信息,而這也是它之所以被稱為輕量級的原因。一般來說,一個進程代表程序的一個實例,而LWP代表程序的執行線程(其實,在內核不支持線程的時候,LWP可以很方便地提供線程的實現)。因為一個執行線程不像進程那樣需要那么多狀態信息,所以LWP也不帶有這樣的信息。

LWP的一個重要作用是提供了一個用戶級線程實現的中間系統。LWP可以通過系統調用獲得內核提供的服務,因此,當一個用戶級線程運行時,只需要將它連接到一個LWP上便可以具有內核支持線程的所有屬性。

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

但有些資源是每個線程各有一份的:
1. 線程id
2. 上下文,包括各種寄存器的值、程序計數器和棧指針
3. ??臻g
4. errno變量
5. 信號屏蔽字
6. 調度優先級

進程強調獨占,而線程強調共享。線程私有最重要的是:硬件上下文,棧幀。

多個線程看見公共資源,如果不保護,則會發生異常,線程安全(一個線程修改會影響另一個線程執行邏輯異常)。

產生線程安全本質:線程共享資源,造成一定影響。

同一個進程內部另一個執行流:信號處理

線程安全:

       線程安全函數:在C語言中局部變量是在棧中分配的,任何未使用靜態數據或其他共享資源的函數都是線程安全的。而使用全局變量的函數是非線程安全的。
       使用靜態數據或其他共享資源的函數,必須通過加鎖的方式來使函數實現線程安全。

       線程安全的:
                   如果一個函數在同一時刻可以被多個線程安全地調用,就稱該函數是線程安全的。
                   線程安全函數解決多個線程調用函數時訪問共享資源的沖突問題。

可重入:

  1. 函數被不同的控制流程調用,有可能在第一次調用還沒返回時就再次進入該函 數,這稱為重入。

  2. 訪問時有可能因為重入而造成錯亂,像這樣的函數稱為 不可重入函數,反之,如果一個函數只訪問自己的局部變量或參數,則稱為可重入函數。

3..可重入函數特點: 函數可以由多于一個線程并發使用,而不必擔心數據錯誤??芍厝牒瘮悼梢栽谌我鈺r刻被中斷,稍后再繼續運行,不會丟失數據??芍?入性解決函數運行結果的確定性和可重復性。 所謂可重入函數是指一個可以被多個任務調用的過程,任務在調用時不必擔心數據是否會出錯。

可重入函數編寫規范為:

1、不在函數內部使用靜態或全局數據 
2、不返回靜態或全局數據,所有數據都由函數的調用者提供。 
3、使用本地數據,或者通過制作全局數據的本地拷貝來保護全局數據。
4、如果必須訪問全局變量,利用互斥機制來保護全局變量。
5、不調用不可重入函數。

兩者之間的關系:
1、一個函數對于多個線程是可重入的,則這個函數是線程安全的。
2、一個函數是線程安全的,但并不一定是可重入的?!臼褂没コ怄i實現的線程安全】
3、可重入性要強于線程安全性。

注:可重入函數是指函數內部沒有使用共享變量??芍厝牒瘮凳蔷€程安全函數的一個真子集。

C語言:可重入函數是說當一個函數被不同的線程同時訪問的時候,每一個調用都獨自使用自己的一份數據,多次調用之間不存在數據共享。所以說C語言可重入的函數一定是線程安全的,因為根本就不存在多個線程共享一份數據問題,就不會發生訪問沖突??芍厝牒瘮档囊笫呛瘮挡辉L問全局或靜態變量。

線程安全如果多個線程對同一個函數的多次調用之間存在共享數據,所有對共享數據的訪問都必須是序列化的,每個線程按先來后到排隊訪問,也就是不存在同時訪問。

C++中:類的成員函數可重入是說:類的成員函數在被多個線程在不同實例里面訪問(每個線程一個實例)時,不存在共享數據,也不會有數據沖突。

類的可重入表示類的所有成員函數都是可重入的。
類的線程安全是說:類的同一個實例被多個線程訪問的時候,對數據的操縱是序列化的,不會有訪問沖突。

兩者之間的區別:

1.可重入概念只和函數訪問的變量類型有關,和是否使用鎖沒有關系。
2.而線程安全和鎖的使用關系密切,很多時候線程安全是靠鎖來保證的。

關于“線程安全與可重入函數的區別有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女