信號安全跟線程安全函數背後本質

    看UNIX編程相關的書在講信號的時候會列出一大堆的保證信號安全的函數,在講線程的時候也會例出一些不保證線程安全的函數。需要把它們都記下來嗎?我覺得太可不必,也不科學,不瞭解根本你很可能自己寫出一個不安全的函數,然後在信號處理裏或是多線程程序裏使用,出了問題卻莫名其妙! 

    一般來說如果函數內部使用了靜態變量或是全局變量,或是傳了引用進去的函數就不具可重入性。具體可重入函數的概念可以去百度一下。 

    在帶信號處理的程序裏,因爲信號處理的異步性,所以很可能當你正在調用函數A的時候被信號打斷了,當你在該信號時處理函數裏又調用了函數A,這進你就重複調用了函數A,這時就你要考慮函數A是不是可重入函數。所以一個函數是否信號安全基本就跟該函數是否可重入相等。

     在多線程程序裏也一樣,因爲子線程隨時可能在某個函數裏被中斷,然後去運行另一個線程,如果另一個線程裏也恰好調用了這個函數,這樣是否線程安全也同樣被提出來了。 

     從上是否就可以得出信號安全跟線程安全就是相等了呢?事實是不一樣的,要不然那些教材也不會分別把信號安全跟線程安全的函數列出來,舉個簡單的例子,malloc不是信號安全的,但卻是線程安全的,這內部的區別在哪呢?百度一下,原來,malloc函數的內部使用了鎖的機制,所以,當你如果程序裏調用了malloc前在調度這個函數時被信號中斷了再在信號處理函數裏調用malloc的話,就有可能出現死鎖。而此種情況在多線程程序裏卻不存在,因爲第二個線程會掛起,繼續運行線程1直接線程1完成malloc釋放鎖。 所以信號安全跟線程安全基本相同,但考慮到信號處理函數必須返回後程序才能繼續,信號安全跟線程安全又稍有不同。

發佈了121 篇原創文章 · 獲贊 34 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章