可重入函數(簡單解析,僅供參考)

概念:

可重入函數:一個函數,被多個任務同時調用時,不用擔心數據會發生錯誤的函數-------------------------該定義是我自己定義的僅供參考

概念解析:

滿足上面的概念的情況有下面幾種(對於linux而言):

1、除了使用自己棧上的變量以外不依賴其他的static環境資源

2、若一定要使用全局變量,一定要試試保護手段,如:加鎖,信號量等多種方式

 

主要:可重入在並行環境中非常重要,若要訪問全局變量時,由於要做保護的措施,因而會損失一些性能代價;在實時操作系統中(如:vxworks)不可重入函數,是被認爲是不安全的函數(可以理解,若在航空或軍用領域,出現中斷,若出現不可重入函數,那將是致命的)

 

對於linux而言不可重入函數有一下幾類(可能不完整,歡迎一起討論):

1、函數使用了靜態數據結構;

如:全局變量,靜態局部變量(這裏包活返回的也是static的值)而沒有實施保護措施的函數

 

2、函數調用了malloc和free

對於這個問題,我只能膚淺的理解,以下解釋僅供參考:

malloc函數在分配堆空間時,維持一個內存鏈表(在malloc的時候分配的內存可能不是連續的,跟我們鏈式存儲類似),當我在malloc的同時,如果發生多個任務調度,或者是中斷時,後一個malloc可能會破壞前一個malloc的數據結構(如;前一個可能正在修改內存鏈表,後一個malloc剛好分配了前一個malloc的修改點的內存,可能導致內存數據結構出錯,從而導致數據出錯)

 

3、函數調用了標準I/O

這裏我個人覺得除了標準I/O還應該有文件I/o,如下解釋:

對於標準I/O是帶緩衝區的I/O流,當我們在訪問一個函數的流時(如:輸出流),突然另一個任務也再訪問這流,由於兩個流公用一個緩衝區(這裏可以理解爲靜態數據結構了),從而可能導致了數據出現錯誤

對於文件I/O;我個人覺得,由於文件描述符是內存的索引;在多線程中,由於主線程用了相同的文件描述符(如:0,1),可能同時訪問一個快內存的索引,也即是訪問同一個塊內存,從而可能導致數據結構出現錯誤,也會導致數據出現錯誤。

 

 也考參照資源瞭解:http://www.ibm.com/developerworks/cn/linux/l-reent.html

對於vxworks,我在網上了解了,它用了一下幾種方式來解決不可重入的問題:

1、動態的堆棧分配機制,即:每個函數有自己的堆棧空間

2、受保護的靜態變量和全局變量

3、任務變量================對於這個概念 我理解不是很清晰,不便多說

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章