Linux下常見可重入函數:markdown
POSIX.1-20001標準規定,全部的標準庫函數都必須是可重入函數,除了如下這些:數據結構
上面是兩張可重入函數的函數表,那,什麼是可重入函數呢?ide
可重入函數主要用於多任務環境中,一個可重入的函數簡單來講就是能夠被中斷的函數,也就是說,能夠在這個函數執行的任什麼時候刻中斷它,轉入OS調度下去執行另一段代碼,而返回控制時不會出現什麼錯誤;而不可重入的函數因爲使用了一些系統資源,好比全局變量區,中斷向量表等,因此它若是被中斷的話,可能會出現問題,這類函數是不能運行在多任務環境下的。函數
不可重入的特色:若是一個函數符合如下條件之一則是不可重入的
(1)調用了malloc/free函數,由於malloc函數是用全局鏈表來管理堆的
(2)調用了標準I/O庫函數,標準I/O庫的不少實現都是以不可重入的方式使用全局的數據結構
(3)可重入體內使用了靜態的數據結構性能
1.不在函數內部使用靜態或全局變量 2.不返回靜態或全局變量,全部數據都有函數的調用者提供。 3.使用本地數據,或經過製做全局數據的本地拷貝來保護全局數據 4.不調用不可重入函數
若是確實須要訪問全局變量(包括 static),必定要注意實施互斥手段。可重入函數在並行運行環境中很是重要,可是通常要爲訪問全局變量付出一些性能代價。
編寫可重入函數時,若使用全局變量,則應經過關中斷、信號量(即P、V操做)等手段對其加以保護。atom