2011-08-11 48 views
7

什麼是可重入程序,您可以舉例說明何時使用它?什麼是可重入程序?

編輯:此外,多個進程可以並行訪問並行

請提供比維基百科解釋不同的方式,因爲我不完全理解他們的描述,因此,我的問題這裏

回答

15

重入式背後的想法是,例程可能在它已經執行的過程中被調用,它仍然可以正常工作。

一般情況下,這是通過僅使用堆棧中聲明的參數和局部變量(以C語言表示,沒有static當地人)來實現的。在執行過程中不鎖定任何全球資源也很重要。

現在,你可能會問:「像一個例程一次多次運行這樣的奇怪事情怎麼會發生?」那麼,某些方面,這可能發生的是:

  • 的程序遞歸(或相互遞歸與其他組例程)。
  • 它被另一個線程調用。
  • 它被中斷調用。

如果發生這些情況,並且例程正在修改全局(或局部),則新執行可能會消除第一次執行所做的更改。舉個例子,如果這個全局被用作循環控制變量,它可能會導致第一次執行,當它最終恢復時,循環錯誤的次數。

+0

請注意,您的情況下不需要重入(2)(它被另一個線程調用)。對於這種情況,鎖定總是足夠的,因爲每個線程都可以獨立進行。遞歸調用和來自信號處理程序的調用的不同之處在於,「外部」調用在「內部」調用返回之前無法進展。 –

+0

請注意,通過使用線程本地存儲,非重入函數可以是線程安全的。 –

2

這是一個可以當它已經被激活調用子程序。例如,遞歸函數通常是可重入的。從信號處理程序調用的函數也必須是可重入的。重入函數是線程安全的,但並非所有線程安全的都是可重入的。

+0

上創建的堆棧幀的一部分。遞歸函數不一定是可重入的。例如:'int fact(int x){static int tmp = fact(x-1);返回x> 1? x * tmp:1; }' –

+0

@R ...,按我的看法改變,但你的例子是錯誤的(靜態變量只在第一次調用時被初始化)。 – AProgrammer

+0

對不起,我很懶,試圖將其納入評論。正確的版本是:'int fact(int x){static int tmp; tmp = fact(x-1);返回x> 1? x * tmp:1; }' –

1

可重入過程是指在同一時間段內,多個用戶可以共享一份程序代碼。重新進入有兩個關鍵方面:程序代碼不能自行修改,每個用戶的本地數據必須單獨存儲。

在共享系統中,重入允許更有效地使用主存儲器:程序代碼的一個副本保存在主存儲器中,但多個應用程序可以調用該過程。因此,可重入過程必須具有永久部分(組成過程的指令)和臨時部分(指向調用程序的指針以及程序使用的局部變量的內存)。

過程的每個執行實例(稱爲激活)都將執行永久部分中的代碼,但必須擁有自己的局部變量和參數副本。與特定激活相關的臨時部分被稱爲激活記錄。

支持可重入程序的最方便的方法是通過堆棧。當調用可重入過程時,激活記錄將成爲在過程調用