可重入函數與線程安全

    可重入函數與線程安全          安全

線程安全:多線程

假如在一個函數中它是這麼寫的,在一個全局鏈表上存放數據,在單線程模式下,咱們先new一個新的節點而後讓head->next指向這個節點,這種場景在多線程場景下會是這樣的過程,線程一new了一個節點,而後cpu轉去執行線程二,線程二new一個節點後head->next指向線程二,而後執行線程一,線程一的head->next也指向它剛剛new出來的節點,這就致使一個head指向了兩個節點,這也就是線程安全的問題。
ide

致使線程安全問題須要知足下面兩個條件:函數

1>:必定是發生在多個線程訪問一個全局變量或者靜態變量的場景下面。
2>:操做時非原子性的。
spa

如何避免線程安全:線程

對訪問全局或靜態變量的語句先後加鎖,這樣就不會致使多個線程訪問同一個資源的問題發生。接口

可重入函數:資源

可重入函數的概念很簡單,就是這個函數是能夠在任什麼時候候均可以被打斷,而且不會形成線程安全,因爲在可重入函數中使用的都是線程本身的棧空間,變量是惟一的,不會形成訪問同一個資源的問題,若是要在其種訪問全局或靜態變量仍是要加上鎖來避免衝突。it

系統中有很些函數是不能用在可重入函數中的:例如malloc,new,還有一些I/O接口函數等。class

相關文章
相關標籤/搜索