十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
若一個(gè)程序或子程序可以安全的被并行執(zhí)行,則稱其為可重入(reentrant或re-entrant)的;即,當(dāng)該子程序正在運(yùn)行時(shí),可以再次進(jìn)入并執(zhí)行它。若一個(gè)函數(shù)是可重入的,則該函數(shù):不能含有靜態(tài)(全局)非常量數(shù)據(jù)。 不能返回靜態(tài)(全局)非常量數(shù)據(jù)的地址。 只能處理由調(diào)用者提供的數(shù)據(jù)。 不能依賴于單實(shí)例模式資源的鎖。 不能調(diào)用不可重入的函數(shù)。 多'用戶/對(duì)象/進(jìn)程優(yōu)先級(jí)'以及多進(jìn)程一般會(huì)使得對(duì)可重入代碼的控制變得復(fù)雜。同時(shí),IO代碼通常不是可重入的,因?yàn)樗麄円蕾囉谙翊疟P這樣共享的、單獨(dú)的資源??芍厝胄允呛瘮?shù)編程語(yǔ)言的關(guān)鍵特性之一。 例子在以下的C語(yǔ)言代碼中,函數(shù)f和函數(shù)g都不是可重入的。int g_var = 1;int f(){ g_var = g_var + 2; return g_var;}int g(){ return f() + 2;}以上代碼中,f使用了全局變量 g_var,所以,如果兩個(gè)線程同時(shí)執(zhí)行它并訪問g_var,則返回的結(jié)果取決于執(zhí)行的時(shí)間。因此,f不可重入。而g調(diào)用了f,所以它也不可重入。稍作修改后,兩個(gè)函數(shù)都是可重入的:int f(int i){ return i + 2;}int g(int i){ return f(i) + 2;}
成都創(chuàng)新互聯(lián)長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為巴楚企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè),巴楚網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
假如,main()中正在調(diào)用A()函數(shù).在此期間,有一中斷,在中斷服務(wù)程序中還要調(diào)用A().
如果這個(gè)A()可以被調(diào)用就算是可重入
反之算不可重入.
可重入與不可重入的區(qū)別在這個(gè)函數(shù)的內(nèi)容是否會(huì)相互沖突...例如A()中有個(gè)靜態(tài)變量...就不可以..
可以使用全局變量、靜態(tài)變量。關(guān)鍵是不是“只讀”。如果只讀,那怎么用都行。如果有寫的操作,最好避開,實(shí)在避不開就要用信號(hào)量等機(jī)制防止多線程沖突。
另外就是調(diào)用的函數(shù)要線程安全, thread-safe.具體那些函數(shù)線程安全,需要查閱手冊(cè)。
一、可重入函數(shù)
1)什么是可重入性?
可重入(reentrant)函數(shù)可以由多于一個(gè)任務(wù)并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯(cuò)誤。相反, 不可重入(non-reentrant)函數(shù)不能由超過一個(gè)任務(wù)所共享,除非能確保函數(shù)的互斥(或者使用信號(hào)量,或者在代碼的關(guān)鍵部分禁用中斷)??芍厝?函數(shù)可以在任意時(shí)刻被中斷,稍后再繼續(xù)運(yùn)行,不會(huì)丟失數(shù)據(jù)??芍厝牒瘮?shù)要么使用本地變量,要么在使用全局變量時(shí)保護(hù)自己的數(shù)據(jù)。
2)可重入函數(shù):
不為連續(xù)的調(diào)用持有靜態(tài)數(shù)據(jù)。
不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。
使用本地?cái)?shù)據(jù),或者通過制作全局?jǐn)?shù)據(jù)的本地拷貝來保護(hù)全局?jǐn)?shù)據(jù)。
如果必須訪問全局變量,記住利用互斥信號(hào)量來保護(hù)全局變量。
絕不調(diào)用任何不可重入函數(shù)。
3)不可重入函數(shù):
函數(shù)中使用了靜態(tài)變量,無論是全局靜態(tài)變量還是局部靜態(tài)變量。
函數(shù)返回靜態(tài)變量。
函數(shù)中調(diào)用了不可重入函數(shù)。
函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結(jié)構(gòu);
函數(shù)體內(nèi)調(diào)用了malloc()或者free()函數(shù);
函數(shù)體內(nèi)調(diào)用了其他標(biāo)準(zhǔn)I/O函數(shù)。
函數(shù)是singleton中的成員函數(shù)而且使用了不使用線程獨(dú)立存儲(chǔ)的成員變量 。
總的來說,如果一個(gè)函數(shù)在重入條件下使用了未受保護(hù)的共享的資源,那么它是不可重入的。