可重入是什么意思 可重入鎖的原理?
可重入鎖的原理?重入鎖實(shí)現(xiàn)的原理或機(jī)制如下:每個(gè)鎖都與一個(gè)線程保持器和一個(gè)計(jì)數(shù)器相關(guān)聯(lián)。當(dāng)計(jì)數(shù)器為0時(shí),表示鎖沒有被任何線程持有,那么任何線程都可以獲得鎖并調(diào)用相應(yīng)的方法。當(dāng)線程請(qǐng)求成功時(shí),JVM將記
可重入鎖的原理?
重入鎖實(shí)現(xiàn)的原理或機(jī)制如下:
每個(gè)鎖都與一個(gè)線程保持器和一個(gè)計(jì)數(shù)器相關(guān)聯(lián)。當(dāng)計(jì)數(shù)器為0時(shí),表示鎖沒有被任何線程持有,那么任何線程都可以獲得鎖并調(diào)用相應(yīng)的方法。當(dāng)線程請(qǐng)求成功時(shí),JVM將記錄持有鎖的線程,并將計(jì)數(shù)器設(shè)置為0 1。此時(shí),如果其他線程請(qǐng)求鎖,則必須等待;如果持有鎖的線程再次請(qǐng)求鎖,則可以再次獲得鎖,計(jì)數(shù)器將增加;當(dāng)線程退出同步代碼塊時(shí),計(jì)數(shù)器將減少;如果計(jì)數(shù)器為0,則釋放鎖。
什么是可重入?
可重入函數(shù)可由多個(gè)任務(wù)同時(shí)使用,無(wú)需擔(dān)心數(shù)據(jù)錯(cuò)誤。相反,非可重入函數(shù)不能由多個(gè)任務(wù)共享,除非它們相互排斥(或者使用信號(hào)量,或者在代碼的關(guān)鍵部分禁用中斷)??芍厝牒瘮?shù)可以隨時(shí)中斷,以后繼續(xù)運(yùn)行而不會(huì)丟失數(shù)據(jù)。可重入函數(shù)要么使用局部變量,要么在使用全局變量時(shí)保護(hù)其數(shù)據(jù)??芍厝牒瘮?shù):不為連續(xù)調(diào)用保存靜態(tài)數(shù)據(jù)。不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。通過(guò)使用本地?cái)?shù)據(jù)或制作全局?jǐn)?shù)據(jù)的本地副本來(lái)保護(hù)全局?jǐn)?shù)據(jù)。如果必須訪問(wèn)全局變量,請(qǐng)記住使用互斥信號(hào)量來(lái)保護(hù)它們。永遠(yuǎn)不要調(diào)用任何不可重入的函數(shù)。
什么是可重入函數(shù)?
可重入函數(shù):主要用于多任務(wù)環(huán)境??芍厝牒瘮?shù)只是一個(gè)可以中斷的函數(shù)。換言之,當(dāng)函數(shù)被執(zhí)行時(shí),它可以在任何時(shí)候被中斷,然后轉(zhuǎn)移到操作系統(tǒng)調(diào)度以執(zhí)行另一段代碼。返回控件時(shí)不會(huì)出錯(cuò)。
單片機(jī)C語(yǔ)言設(shè)計(jì)里說(shuō)的可重入函數(shù)是什么?和不可重入函數(shù)的區(qū)別是什么?
1、可重入函數(shù)
1)什么是可重入函數(shù)?
可重入函數(shù)可由多個(gè)任務(wù)同時(shí)使用,無(wú)需擔(dān)心數(shù)據(jù)錯(cuò)誤。相反,非可重入函數(shù)不能由多個(gè)任務(wù)共享,除非它們相互排斥(或者使用信號(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)用者提供。
通過(guò)使用本地?cái)?shù)據(jù)或制作全局?jǐn)?shù)據(jù)的本地副本來(lái)保護(hù)全局?jǐn)?shù)據(jù)。
如果必須訪問(wèn)全局變量,請(qǐng)記住使用互斥信號(hào)量保護(hù)它們。
切勿調(diào)用任何不可重入函數(shù)。
3)不可重入函數(shù):
函數(shù)中使用靜態(tài)變量,無(wú)論是全局變量還是局部變量。
函數(shù)返回一個(gè)靜態(tài)變量。在函數(shù)中調(diào)用不可重入的函數(shù)。
在函數(shù)體中使用靜態(tài)數(shù)據(jù)結(jié)構(gòu);
在函數(shù)體中調(diào)用malloc()或free()函數(shù);
在函數(shù)體中調(diào)用其他標(biāo)準(zhǔn)I/O函數(shù)。
函數(shù)是單例中的成員函數(shù),它使用的成員變量不是由線程獨(dú)立存儲(chǔ)的。
一般來(lái)說(shuō),如果函數(shù)在重入條件下使用未受保護(hù)的共享資源,則該函數(shù)不可重入
請(qǐng)舉例說(shuō)明。編寫以下VI按照默認(rèn)設(shè)置執(zhí)行程序,整體輸出X-Y為2000ms,這是因?yàn)闉榱吮苊獾刂分袛?shù)據(jù)的混淆,LabVIEW會(huì)先執(zhí)行一個(gè)VI再執(zhí)行另一個(gè)VI,執(zhí)行順序是隨機(jī)的。如果將delay VI的屬性設(shè)置為“共享拷貝重入執(zhí)行”或“預(yù)分割拷貝重入執(zhí)行”,然后執(zhí)行該程序,則發(fā)現(xiàn)該程序已改為原來(lái)的1000ms,這是因?yàn)椋篖abVIEW在異地調(diào)用可重入VI時(shí),會(huì)給它分配一個(gè)單獨(dú)的數(shù)據(jù)地址空間。這是線程安全的。在兩個(gè)線程中執(zhí)行的sub VI使用存儲(chǔ)在不同地址的兩個(gè)數(shù)據(jù)副本,這不會(huì)引起混淆。VI的重入不會(huì)使程序無(wú)序運(yùn)行,但也會(huì)增加內(nèi)存消耗。相當(dāng)于多個(gè)VI重入調(diào)用占用不同的空間。
關(guān)于Labview 2012中VI的可重入性修改?
可重入鎖:支持重復(fù)輸入的鎖。這意味著鎖可以支持線程對(duì)資源的重復(fù)鎖定。
關(guān)鍵字“sychronized”隱式支持重入,例如使用sychronized修改的遞歸方法。在方法執(zhí)行期間,執(zhí)行線程在獲取鎖之后可以多次獲取鎖。
盡管reentrantlock不能像sychnronized關(guān)鍵字那樣隱式地重新輸入,但是在調(diào)用lock()方法時(shí),獲得鎖的線程可以再次調(diào)用lock()方法來(lái)獲得鎖,而不會(huì)被阻止。
如何理解Java鎖的可重入性?
使用Keil C51編譯器在51核MCU上編寫C程序時(shí),這個(gè)問(wèn)題可能更嚴(yán)重。因?yàn)閗eil通過(guò)覆蓋技術(shù)優(yōu)化變量,相同的內(nèi)存地址可能會(huì)被重復(fù)分配給不同的函數(shù)。例如,在主函數(shù)中調(diào)用的延遲函數(shù)的變量可以被中斷函數(shù)調(diào)用的相同延遲函數(shù)的變量所覆蓋。因此,在keilc51中編寫可能同時(shí)被多個(gè)函數(shù)調(diào)用的子函數(shù)時(shí),最好將其聲明為可重入函數(shù)。
單片機(jī)用的軟件的可重入函數(shù)與非可重入函數(shù)有啥區(qū)別?
字面意思是您可以重復(fù)輸入??芍厝胄允嵌嗳蝿?wù)系統(tǒng)中的一個(gè)概念,它意味著該函數(shù)在運(yùn)行到任何位置時(shí)都可以被中斷以執(zhí)行其他任務(wù),并且返回時(shí)不會(huì)出錯(cuò)。當(dāng)我們同時(shí)處理多個(gè)任務(wù)時(shí),為什么會(huì)有這個(gè)概念呢。我舉個(gè)例子。我們定義了一個(gè)名為func的函數(shù)和兩個(gè)線程。兩個(gè)線程都調(diào)用func。情況就是這樣。當(dāng)線程1執(zhí)行func時(shí),線程2開始執(zhí)行func。結(jié)果,兩個(gè)線程都執(zhí)行了兩次func。在正常情況下,兩個(gè)線程都可以成功執(zhí)行,并且沒有錯(cuò)誤。我們認(rèn)為func是一個(gè)可重入函數(shù)。但是,如果func使用一個(gè)公共資源,例如讀取同一個(gè)文件或訪問(wèn)同一個(gè)全局變量,則當(dāng)兩個(gè)線程訪問(wèn)公共資源時(shí),會(huì)導(dǎo)致沖突。這樣的函數(shù)是不可重入的。
什么是C語(yǔ)言的可重入函數(shù)?怎么使用?
假設(shè)exam是int型全局變量,函數(shù)squareuexam返回exam的平方。那么下面的函數(shù)是不可重入的。
unsigned int example(int para)
{
unsigned int temp
Exam=para//(**)
temp=Square如果此函數(shù)由多個(gè)進(jìn)程調(diào)用,則結(jié)果可能未知,因?yàn)槭褂么撕瘮?shù)的另一個(gè)進(jìn)程可能會(huì)在執(zhí)行(**)語(yǔ)句后被激活,因此,當(dāng)新激活的進(jìn)程執(zhí)行此函數(shù)時(shí),它將為exam分配一個(gè)不同的para值,因此當(dāng)控件在“exam()”之后返回到“temp=square”時(shí),計(jì)算出的temp可能不是預(yù)期的結(jié)果。該功能應(yīng)改進(jìn)如下。
Unsigned int example(int para)
{
Unsigned int temp
[請(qǐng)求信號(hào)量操作]//(1)
exam=para
temp=squareuuexam()
[釋放信號(hào)量操作
]返回temp
}](1)如果“信號(hào)量”無(wú)法應(yīng)用,它表示另一個(gè)進(jìn)程正在為檢查賦值并計(jì)算其平方(即,它正在使用此信號(hào))。此進(jìn)程必須等待其釋放信號(hào),然后才能繼續(xù)執(zhí)行。如果應(yīng)用了該信號(hào),它可以繼續(xù)執(zhí)行,但是其他進(jìn)程必須等待該進(jìn)程釋放信號(hào)量,然后才能再次使用該信號(hào)。
確??芍厝牒瘮?shù)的方法:在編寫函數(shù)時(shí),盡量使用局部變量(如寄存器和堆棧中的變量),并保護(hù)要使用的全局變量(如關(guān)閉中斷、信號(hào)量等),以便函數(shù)必須是可重入函數(shù)。
VxWorks中使用的可重入技術(shù)如下:
*動(dòng)態(tài)堆棧變量(每個(gè)子函數(shù)都有自己獨(dú)立的堆??臻g)
*受保護(hù)的全局變量和靜態(tài)變量
*任務(wù)變量