可重入性和執行緒安全

科技小能手發表於2017-11-12
可重入性就是執行緒安全嗎?很多人包括我自己起初都不過分割槽分它們,實際上也沒有過分它們的必要,程式設計師是幹活的,就像民工只要澆鑄混凝土就可以了,然而如果程式設計師對一些平常的操作知其所以然後,就可能成為策劃者。 
首先這兩者都是和共享變數,全域性變數,靜態變數相關的,因為傳統的c語言都是序列過程化操作的,c語言裡面並沒有執行緒的概念,在沒有執行緒的日子裡,一切都 很幸福,那時的世界就是c語言本真的世界,全域性變數和靜態變數很好的為程式服務,一切那麼安詳,全域性變數彷彿生活在自己的仙境裡,沒有任何責備,那時它很 幸福,然而執行緒打破了這種寧靜,執行緒,這個馮諾依曼家族的怪胎使得全域性變數成了罪惡的根源,在馮氏家族,本應該是序列的過程世界,執行緒的出現,使得大家帶 著腳鐐跳舞,這種痛苦加之這個世界固有的惰性帶來了罪惡,這種罪惡就是併發,全域性變數不再像以前那樣自然,如果你的程式碼中有了全域性變數,那麼它很可能帶來 一個同步問題,比如一個全域性變數,兩個執行緒操作,那麼必然要給這個全域性變數戴上腳鐐,呵呵,真的很不公不平,明明執行緒是個入侵者,為何把腳鐐拷在全域性變數 腳上,雖然不公平,但是我們必須接受事實,這個世界上永遠都是這樣,有時候牽強的東西雖然不好,但是我們必須接受,因為立法者永遠不被我們觸控。 
因此,如果一個函式的實現裡面在不加鎖的情況之下隨意操作全域性變數,那麼它就是執行緒不安全的,因為該函式沒有限制全域性變數,沒有讓全域性變數更加“適應”線 程,那麼什麼是可重入函式呢?顧名思義,可重入就是一個執行緒沒有離開這個函式的時候允許另一個執行緒進入該函式。執行緒安全強調的是該函式的實現操作,而 可重入性則更多的強調該函式的呼叫規則,因此函式的可重入性約束要高於執行緒安全,可重入函式一定是執行緒安全的,可重入函式除了不能隨意無鎖操作全域性或靜態 變數外還不能返回它們,因為可重入性是呼叫相關的,一個函式的呼叫有幾個方面:呼叫,實現,引數,返回值。 
最後舉個例子,考慮以下函式: 
int global = -1; 
int test() 


 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273974


相關文章