可重入函數對于線程安全意義(附函數表)

      網友投稿 858 2022-05-29

      是什么

      什么是可重入函數,什么是不可重入函數?

      不可重入函數:

      在并發服務器中,經常會出現多個任務調用同一個函數的情況,比方說后端服務器使用多線程同時對數據庫進行訪問操作。如果有一個函數不幸被設計成為這樣:那么不同任務調用這個函數時可能修改其他任務調用這個函數的數據,從而導致不可預料的后果。這樣的函數是不安全的函數,也叫不可重入函數。

      (其實也沒什么不可預料的,就是服務器崩了唄,然后我就完了唄)

      可重入函數:

      所謂可重入是指一個可以被多個任務調用的過程,任務在調用時不必擔心數據是否會出錯。

      一個可重入的函數簡單來說就是可以被中斷的函數。

      可重入函數的分類

      (1)顯式可重入函數

      如果所有函數的參數都是傳值傳遞的(沒有指針),并且所有的數據引用都是本地的自動棧變量(也就是說沒有引用靜態或全局變量),那么函數就是顯示可重入的,也就是說不管如何調用,我們都可斷言它是可重入的。

      (2)隱式可重入函數

      可重入函數中的一些參數是引用傳遞(使用了指針),也就是說,在調用線程小心地傳遞指向非共享數據的指針時,它才是可重入的。

      可重入函數可以有多余一個任務并發使用,而不必擔心數據錯誤,相反,不可重入函數不能由超過一個任務所共享,除非能確保函數的互斥(或者使用信號量,或者在 代碼的關鍵部分禁用中斷)。可重入函數可以在任意時刻被中斷,稍后再繼續運行,不會丟失數據,可重入函數要么使用本地變量,要么在使用全局變量時保護自己 的數據。

      為什么

      為什么有的函數可重入,又有的函數不可重入?

      為什么可重入

      一個可重入函數可以被多個執行流重復進入,內部使用的數據都應該來自于自身的棧空間,包括返回值也不應該是全局或者靜態的,可以允許有該函數的多個副本在運行,而正是因為其中的操作數據都來自于自身的棧空間,而每次調用函數會開辟不同的棧空間,因此二者互不影響。

      為什么不可重入

      不可重入的特點:如果一個函數符合以下條件之一則是不可重入的

      可重入函數對于線程安全的意義(附函數表)

      (1)調用了malloc/free函數,因為malloc函數是用全局鏈表來管理堆的

      (2)調用了標準I/O庫函數,標準I/O庫的很多實現都是以不可重入的方式使用全局的數據結構

      (3)可重入體內使用了靜態的數據結構

      怎么做

      任何確保寫的函數可重入

      1.不在函數內部使用靜態或全局變量

      2.不返回靜態或全局變量,所有數據都有函數的調用者提供。

      3.使用本地數據,或通過制作全局數據的本地拷貝來保護全局數據

      4.不調用不可重入函數

      如果確實需要訪問全局變量(包括 static),一定要注意實施互斥手段。可重入函數在并行運行環境中非常重要,但是一般要為訪問全局變量付出一些性能代價。

      編寫可重入函數時,若使用全局變量,則應通過關中斷、信號量(即P、V操作)等手段對其加以保護。

      舉例

      Linux下常見可重入函數

      上面那個不夠滿足的話,看下面這個:

      POSIX.1-20001標準規定,所有的標準庫函數都必須是可重入函數,除了以下這些:

      當然,咱自己寫出不可重入函數就另當別論了。

      其他

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

      (1)、可重入函數是線程安全函數的一種,其特點在于它們被多個線程調用時,不會引用任何共享數據。

      (2)、線程安全是在多個線程情況下引發的,而可重入函數可以在只有一個線程的情況下來說。

      (3)、線程安全不一定是可重入的,而可重入函數則一定是線程安全的。

      (4)、如果一個函數中有全局變量,那么這個函數既不是線程安全也不是可重入的。

      (5).如果將對臨界資源的訪問加上鎖,則這個函數是線程安全的,但如果這個重入函數若鎖還未釋放則會產生死鎖,因此是不可重入的。

      (6)、線程安全函數能夠使不同的線程訪問同一塊地址空間,而可重入函數要求不同的執行流對數據的操作互不影響使結果是相同的。

      任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:軟件測試(功能、接口、性能、自動化)詳解
      下一篇:Python 前端開發之HTML
      相關文章
      久久国产亚洲高清观看| 亚洲午夜久久久久久久久电影网| 亚洲AV电影院在线观看| 狠狠综合久久综合88亚洲| 亚洲成av人片在线观看天堂无码 | 亚洲色大成网站www永久网站| 亚洲国产成+人+综合| 亚洲国产精品成人综合色在线婷婷| 亚洲精品线在线观看| 亚洲自偷自拍另类12p| 久久精品国产亚洲av日韩| 亚洲黄色网站视频| 亚洲激情校园春色| 亚洲一区精彩视频| 亚洲精品无播放器在线播放| 亚洲AV无码一区二区三区电影| 亚洲aⅴ无码专区在线观看| 亚洲午夜成人精品无码色欲| 亚洲欧美日韩中文高清www777| 亚洲av永久中文无码精品综合| 亚洲gay片在线gv网站| 亚洲äv永久无码精品天堂久久 | 亚洲国产成人99精品激情在线| 亚洲a级在线观看| 亚洲天然素人无码专区| 亚洲国产成人无码AV在线影院| 国内成人精品亚洲日本语音 | 亚洲第一页在线播放| 亚洲国产视频网站| 国产亚洲精品VA片在线播放| 亚洲女女女同性video| 一本久久综合亚洲鲁鲁五月天| 亚洲国产专区一区| 亚洲日韩av无码| 亚洲成a人片77777kkkk| 亚洲精品福利网泷泽萝拉| 国产成人精品亚洲日本在线| 亚洲国产av玩弄放荡人妇 | 亚洲图片校园春色| 亚洲色大成网站www永久男同| 全亚洲最新黄色特级网站 |