文章出處

線程安全與可重入。

1、什么是線程安全
當一個函數被多個線程反復調用的時候,他會一直產生正確的結果,那么這個函數就是線程安全的。線程安全函數解決了多個線程調用函數時訪問臨界資源的沖突問題。

2、可重入
在多線程或有異常控制流的情況下,當某個函數運行到中途時,控制流有可能被打斷去執行另一個函數,而這”另一個函數”有可能是他本身,如果在這種情況下不會出現問題,比如與說數據或狀態不被破壞,而且行為可預期,那么這個函數就被稱為可重入的。反之,就是不可重入函數 。
簡單來說就是:當一個函數被多個線程調用的時候,不會引用任何共享數據,那么這個函數就是可重入的。可重入函數可以在任意時刻被中斷,稍后再繼續運行,也不會丟失數據。反之就是不可重入。

3、線程安全與可重入的區別于聯系
線程安全的根源就在于”共享數據”。所以不共享任何數據的函數(可重入函數)肯定是線程安全的。但是,即使有共享數據,線程安全還可以通過同步與互斥來保證,所以線程安全并不一定是可重入的。

關系如圖:
這里寫圖片描述
可重入是線程安全的一個真子集,可重入一定線程安全,但線程安全不一定可重入。

4、怎樣編寫可重入函數
關于線程安全,我們可以通過同步與互斥來實現,下面介紹一下編寫可重入函數時的規范:
1、不能在函數內部使用靜態或全局數據
2、不能返回靜態或全局數據,所有數據都有函數的調用者提供
3、使用本地數據、或通過制作全局數據的本地拷貝來保護全局數據。
4、如果必須訪問全局變量,利用互斥機制來保護全局變量。
5、不在可重入函數內部調用不可重入函數。、
6、不調用malloc和free函數,因為malloc是用全局鏈表來管理堆的。
7、不調用了標準I/O函數。標準I/O函數很多都以不可重入的方式實現全局數據結構。

總結:最常見的就是在信號處理函數中不能使用不可重入函數。如果在信號處理函數中使用了不可重入函數,則可能導致程序出現錯誤甚至崩潰。

看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170227/107676.html

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()