可重入和非可重入函數

要解釋可重入函數是何物必須先分清楚單線程程序和多線程程序,典型的UNIX程序都是一個線程貫穿程序始終,cpu圍繞單條執行邏輯來處理,對於多線程程序則是,同一進程卻存在多條獨立併發的執行邏輯。

信號處理器函數因爲使用了信號處理器函數可能會在任一時間點異步中斷程序的執行邏輯,從而在同一進程中存在兩條(即主程序和信號處理函數)獨立(但不是併發)的執行線程。

可重入函數:
如果同一程序的多個線程可以同時安全的調用某一個函數,那麼該函數就是可重入函數。
此處“安全”的意思是,其他線程無論調用該函數的狀態如何都可產生預期結果
不可重入函數:
如果在同一個程序中多個線程不能夠安全的調用某一個函數,那麼這個函數就是不可重入函數

更新全局變量或者靜態數據結構可能是不可重入函數

malloc函數族爲不可重入函數,因爲malloc和free函數維護了一個針對以釋放內存塊的鏈表,如果重新在堆上分配內存可能破壞鏈表結構

printf,scanf也爲不可重入函數,因爲他們會爲緩衝區I/O更新數據結構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章