可重入性和執行緒安全
可重入性就是執行緒安全嗎?很多人包括我自己起初都不過分割槽分它們,實際上也沒有過分它們的必要,程式設計師是幹活的,就像民工只要澆鑄混凝土就可以了,然而如果程式設計師對一些平常的操作知其所以然後,就可能成為策劃者。
首先這兩者都是和共享變數,全域性變數,靜態變數相關的,因為傳統的c語言都是序列過程化操作的,c語言裡面並沒有執行緒的概念,在沒有執行緒的日子裡,一切都 很幸福,那時的世界就是c語言本真的世界,全域性變數和靜態變數很好的為程式服務,一切那麼安詳,全域性變數彷彿生活在自己的仙境裡,沒有任何責備,那時它很 幸福,然而執行緒打破了這種寧靜,執行緒,這個馮諾依曼家族的怪胎使得全域性變數成了罪惡的根源,在馮氏家族,本應該是序列的過程世界,執行緒的出現,使得大家帶 著腳鐐跳舞,這種痛苦加之這個世界固有的惰性帶來了罪惡,這種罪惡就是併發,全域性變數不再像以前那樣自然,如果你的程式碼中有了全域性變數,那麼它很可能帶來 一個同步問題,比如一個全域性變數,兩個執行緒操作,那麼必然要給這個全域性變數戴上腳鐐,呵呵,真的很不公不平,明明執行緒是個入侵者,為何把腳鐐拷在全域性變數 腳上,雖然不公平,但是我們必須接受事實,這個世界上永遠都是這樣,有時候牽強的東西雖然不好,但是我們必須接受,因為立法者永遠不被我們觸控。
因此,如果一個函式的實現裡面在不加鎖的情況之下隨意操作全域性變數,那麼它就是執行緒不安全的,因為該函式沒有限制全域性變數,沒有讓全域性變數更加“適應”線 程,那麼什麼是可重入函式呢?顧名思義,可重入就是一個執行緒沒有離開這個函式的時候允許另一個執行緒進入該函式。執行緒安全強調的是該函式的實現操作,而 可重入性則更多的強調該函式的呼叫規則,因此函式的可重入性約束要高於執行緒安全,可重入函式一定是執行緒安全的,可重入函式除了不能隨意無鎖操作全域性或靜態 變數外還不能返回它們,因為可重入性是呼叫相關的,一個函式的呼叫有幾個方面:呼叫,實現,引數,返回值。
最後舉個例子,考慮以下函式:
int global = -1;
int test()
首先這兩者都是和共享變數,全域性變數,靜態變數相關的,因為傳統的c語言都是序列過程化操作的,c語言裡面並沒有執行緒的概念,在沒有執行緒的日子裡,一切都 很幸福,那時的世界就是c語言本真的世界,全域性變數和靜態變數很好的為程式服務,一切那麼安詳,全域性變數彷彿生活在自己的仙境裡,沒有任何責備,那時它很 幸福,然而執行緒打破了這種寧靜,執行緒,這個馮諾依曼家族的怪胎使得全域性變數成了罪惡的根源,在馮氏家族,本應該是序列的過程世界,執行緒的出現,使得大家帶 著腳鐐跳舞,這種痛苦加之這個世界固有的惰性帶來了罪惡,這種罪惡就是併發,全域性變數不再像以前那樣自然,如果你的程式碼中有了全域性變數,那麼它很可能帶來 一個同步問題,比如一個全域性變數,兩個執行緒操作,那麼必然要給這個全域性變數戴上腳鐐,呵呵,真的很不公不平,明明執行緒是個入侵者,為何把腳鐐拷在全域性變數 腳上,雖然不公平,但是我們必須接受事實,這個世界上永遠都是這樣,有時候牽強的東西雖然不好,但是我們必須接受,因為立法者永遠不被我們觸控。
因此,如果一個函式的實現裡面在不加鎖的情況之下隨意操作全域性變數,那麼它就是執行緒不安全的,因為該函式沒有限制全域性變數,沒有讓全域性變數更加“適應”線 程,那麼什麼是可重入函式呢?顧名思義,可重入就是一個執行緒沒有離開這個函式的時候允許另一個執行緒進入該函式。執行緒安全強調的是該函式的實現操作,而 可重入性則更多的強調該函式的呼叫規則,因此函式的可重入性約束要高於執行緒安全,可重入函式一定是執行緒安全的,可重入函式除了不能隨意無鎖操作全域性或靜態 變數外還不能返回它們,因為可重入性是呼叫相關的,一個函式的呼叫有幾個方面:呼叫,實現,引數,返回值。
最後舉個例子,考慮以下函式:
int global = -1;
int test()
{
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273974
相關文章
- 執行緒安全性-原子性、可見性、有序性執行緒
- 執行緒安全性執行緒
- 二、執行緒安全性執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- 多執行緒高併發程式設計(2) -- 可重入鎖介紹和自定義執行緒程式設計
- 02. 執行緒安全性執行緒
- 多執行緒安全性和Java中的鎖執行緒Java
- java多執行緒3:原子性,可見性,有序性Java執行緒
- 執行緒安全執行緒
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- 執行緒和執行緒池執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 多執行緒的安全性問題(三)執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 執行緒安全(二)執行緒
- Java執行緒安全Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- [Java併發]AQS的可重入性JavaAQS
- JCIP閱讀筆記之執行緒安全性筆記執行緒
- 執行緒安全性保證---JMM特性詳解執行緒
- 深入解讀HashMap執行緒安全性問題HashMap執行緒
- 死鎖和可重入鎖
- 多執行緒和多執行緒同步執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 第10章:併發和分散式程式設計 10.1併發性和執行緒安全性分散式程式設計執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- iOS開發基礎——執行緒安全(執行緒鎖)iOS執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- Concurrency(四:執行緒安全)執行緒
- 容器不是執行緒安全執行緒
- ConcurrentHashMap執行緒安全嗎?HashMap執行緒
- 探究Spring中Bean的執行緒安全性問題SpringBean執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 什麼時候執行緒不安全?怎樣做到執行緒安全?怎麼擴充套件執行緒安全的類?執行緒套件