可重入函式:
當乙個函式被多個執行流重複進入的函式,叫重入。
因為重入導致結果錯誤的函式,叫做不可重入函式。例如在進行無頭結點單鏈表的插入操作時,當node1的next指向head,head還沒有指向node1時,再插入node2,node2的next指向head,head指向node2,這時,node1就會丟失。因為重入,導致結果錯誤了。
滿足下列條件的函式多數是不可重入的:
1) 函式體內使用了靜態的資料結構;
2) 函式體內呼叫了malloc()或者free()函式;
3) 函式體內呼叫了標準i/o函式。
因為重入不會導致結果錯誤的函式,叫做可重入函式。
可重入函式只訪問自己的區域性變數或引數。正是因為這些操作產生的資料都在自身的棧上,所以每次呼叫時,都會開闢新的棧空間,所以彼此不會影響。
執行緒安全:
執行緒安全就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。
執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料
當乙個函式被多個併發程序 反覆呼叫時,它產生的結果一直正確,則這個函式是執行緒安全的。反之,則是執行緒不安全的。
以下四類函式是執行緒不安全的:
1、不保護共享變數的函式;
2、函式狀態隨著呼叫改變的函式;
3、返回指向靜態變數指標的函式;
4、呼叫執行緒不安全函式的函式;
那麼,如何避免執行緒不安全呢?
由於執行緒不安全是因為多個執行緒同時訪問同乙個**,造成的,所以解決的方法就是
1、給這塊**加上鎖,保證始終只有乙個執行緒可以訪問。
2、避免使用全域性變數。
可重入函式與執行緒安全的區別與聯絡:
1、執行緒安全是在多個執行緒下觸發的,可重入函式是在只有乙個執行緒下發生的。
2、執行緒安全不一定是可重入的,可重入函式則一定是執行緒安全的。
3、乙個函式有全域性變數個,它一定不是執行緒安全的,也不是可重入函式的。
4、乙個函式中的資料都是私有棧的,那該函式一定是可重入函式,且執行緒安全的。
5、如果對臨界資源加鎖,則是執行緒安全的,如果重入函式的話前乙個執行流還未解鎖,那麼會造成死鎖,所以不是可重入函式
執行緒安全與可重入函式
可重入函式 reentrant function 與執行緒安全函式 thread safe function 有時容易混淆,而且各種文件中的解釋也不是很清楚,這裡根據筆者的經驗來說明一下。執行緒安全函式 概念 執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反...
可重入函式與執行緒安全
執行緒安全 乙個函式被稱為執行緒安全的 thread safe 當且僅當被多個併發程序反覆呼叫時,它會一直產生正確的結果。如果乙個函式不是執行緒安全的,我們就說它是執行緒不安全的 thread unsafe 我們定義四類 有相交的 執行緒不安全函式。將這類執行緒不安全函式變為執行緒安全的,相對比較容...
可重入函式與執行緒安全
可重入函式與執行緒安全 執行緒安全 假如在乙個函式中它是這麼寫的,在乙個全域性鍊錶上存放資料,在單執行緒模式下,我們先new乙個新的節點然後讓head next指向這個節點,這種場景在多執行緒場景下會是這樣的過程,執行緒一new了乙個節點,然後cpu轉去執行執行緒二,執行緒二new乙個節點後head...