回答
重入式背後的想法是,例程可能在它已經執行的過程中被調用,它仍然可以正常工作。
一般情況下,這是通過僅使用堆棧中聲明的參數和局部變量(以C語言表示,沒有static
當地人)來實現的。在執行過程中不鎖定任何全球資源也很重要。
現在,你可能會問:「像一個例程一次多次運行這樣的奇怪事情怎麼會發生?」那麼,某些方面,這可能發生的是:
- 的程序遞歸(或相互遞歸與其他組例程)。
- 它被另一個線程調用。
- 它被中斷調用。
如果發生這些情況,並且例程正在修改全局(或局部),則新執行可能會消除第一次執行所做的更改。舉個例子,如果這個全局被用作循環控制變量,它可能會導致第一次執行,當它最終恢復時,循環錯誤的次數。
這是一個可以當它已經被激活調用子程序。例如,遞歸函數通常是可重入的。從信號處理程序調用的函數也必須是可重入的。重入函數是線程安全的,但並非所有線程安全的都是可重入的。
上創建的堆棧幀的一部分。遞歸函數不一定是可重入的。例如:'int fact(int x){static int tmp = fact(x-1);返回x> 1? x * tmp:1; }' –
@R ...,按我的看法改變,但你的例子是錯誤的(靜態變量只在第一次調用時被初始化)。 – AProgrammer
對不起,我很懶,試圖將其納入評論。正確的版本是:'int fact(int x){static int tmp; tmp = fact(x-1);返回x> 1? x * tmp:1; }' –
可重入過程是指在同一時間段內,多個用戶可以共享一份程序代碼。重新進入有兩個關鍵方面:程序代碼不能自行修改,每個用戶的本地數據必須單獨存儲。
在共享系統中,重入允許更有效地使用主存儲器:程序代碼的一個副本保存在主存儲器中,但多個應用程序可以調用該過程。因此,可重入過程必須具有永久部分(組成過程的指令)和臨時部分(指向調用程序的指針以及程序使用的局部變量的內存)。
過程的每個執行實例(稱爲激活)都將執行永久部分中的代碼,但必須擁有自己的局部變量和參數副本。與特定激活相關的臨時部分被稱爲激活記錄。
支持可重入程序的最方便的方法是通過堆棧。當調用可重入過程時,激活記錄將成爲在過程調用
- 1. 什麼是可重定位程序?
- 2. 什麼可能是這個程序可能的輸入?
- 3. 這可能是什麼? [程序錯誤]
- 4. 程序需要重啓的程序是什麼?
- 5. 什麼是插入排序?
- 6. 爲什麼這段代碼是可重入的,但不是線程安全的
- 7. 在可可應用程序中嵌入圖像的首選方式是什麼?
- 8. C#程序集,什麼是程序集?
- 9. 什麼程序集是XslTransformException?
- 10. 什麼是協同程序?
- 11. 什麼是DynamicProxyGenAssembly2程序集?
- 12. erxkab1r2c2ibqtnnxtpzrumqv3gqlpl是什麼程序集?
- 13. 什麼程序集是System.Ext?
- 14. 什麼是「上游」程序?
- 15. 什麼是程序集?
- 16. 什麼是主程序集
- 17. 什麼是重入式解析器?
- 18. 什麼是真正的重入功能?
- 19. 什麼是重入鎖和概念?
- 20. Robocopy的「可重啓」選項是什麼?
- 21. (/ value /)是什麼意思?值是子程序的輸入參數
- 22. 什麼是可序列化?這是什麼意思?
- 23. 表單處理最好的可重用Django應用程序是什麼?
- 24. 什麼是應用程序和過程?
- 25. 什麼是多線程應用程序?
- 26. 這個程序的流程是什麼?
- 27. 什麼是MVC程序流程?
- 28. 爲什麼我的程序會重複
- 29. 爲什麼ExecutorChannel.onInit()重置調度程序?
- 30. 用於桌面應用程序的好的可嵌入數據庫是什麼?
請注意,您的情況下不需要重入(2)(它被另一個線程調用)。對於這種情況,鎖定總是足夠的,因爲每個線程都可以獨立進行。遞歸調用和來自信號處理程序的調用的不同之處在於,「外部」調用在「內部」調用返回之前無法進展。 –
請注意,通過使用線程本地存儲,非重入函數可以是線程安全的。 –