可重入性就是線程安全嗎?很多人包括我自己起初都不過分區分它們,實際上也沒有過分它們的必要,程式員是幹活的,就像民工隻要澆鑄混凝土就可以了,然而如果程式員對一些平常的操作知其是以然後,就可能成為策劃者。
首先這兩者都是和共享變量,全局變量,靜态變量相關的,因為傳統的c語言都是串行過程化操作的,c語言裡面并沒有線程的概念,在沒有線程的日子裡,一切都 很幸福,那時的世界就是c語言本真的世界,全局變量和靜态變量很好的為程式服務,一切那麼安詳,全局變量仿佛生活在自己的仙境裡,沒有任何責備,那時它很 幸福,然而線程打破了這種甯靜,線程,這個馮諾依曼家族的怪胎使得全局變量成了罪惡的根源,在馮氏家族,本應該是串行的過程世界,線程的出現,使得大家帶 着腳鐐跳舞,這種痛苦加之這個世界固有的惰性帶來了罪惡,這種罪惡就是并發,全局變量不再像以前那樣自然,如果你的代碼中有了全局變量,那麼它很可能帶來 一個同步問題,比如一個全局變量,兩個線程操作,那麼必然要給這個全局變量戴上腳鐐,呵呵,真的很不公不平,明明線程是個入侵者,為何把腳鐐拷在全局變量 腳上,雖然不公平,但是我們必須接受事實,這個世界上永遠都是這樣,有時候牽強的東西雖然不好,但是我們必須接受,因為立法者永遠不被我們觸摸。
是以,如果一個函數的實作裡面在不加鎖的情況之下随意操作全局變量,那麼它就是線程不安全的,因為該函數沒有限制全局變量,沒有讓全局變量更加“适應”線 程,那麼什麼是可重入函數呢?顧名思義,可重入就是一個執行緒沒有離開這個函數的時候允許另一個執行緒進入該函數。線程安全強調的是該函數的實作操作,而 可重入性則更多的強調該函數的調用規則,是以函數的可重入性限制要高于線程安全,可重入函數一定是線程安全的,可重入函數除了不能随意無鎖操作全局或靜态 變量外還不能傳回它們,因為可重入性是調用相關的,一個函數的調用有幾個方面:調用,實作,參數,傳回值。
最後舉個例子,考慮以下函數:
int global = -1;
int test()
{
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273974