訊號安全跟安全執行緒函數背後本質

來源:互聯網
上載者:User

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

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

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.