“Critical Section”、“Critical Region”和“Constrained Execution Region”的區別
這實際上是三個不同的概念還是我變得混亂?(我一直在閱讀有關執行緒和垃圾收集的文章,並讓自己感到困惑。)
“關鍵部分” - 我認為這可能只是您不希望多個執行緒同時訪問的程式碼部分的術語,即在 lock 和 Monitor.Enter/Exit 語句中?
“關鍵區域” ——這裡沒有真正的線索——MSDN 說了類似“這告訴主機在該部分中拋出的異常可能會產生更廣泛的影響”。並且“CLR 的主機,例如 Sql Server”可以選擇“以不同的方式”處理關鍵區域內拋出的異常。不一樣怎麼辦?為什麼?而且,最重要的是,在哪些現實世界場景中,我可能需要將程式碼標記為關鍵區域?
“受約束的執行區域” - 我在閱讀垃圾收集文章中的 CriticalFinalizerObject 時遇到了這個問題。
我可以從 MSDN 中了解到,這些區域之一中的程式碼以某種方式保證執行(但如何執行?),因此不得拋出“帶外”異常。
什麼是
out-of-band exception? (我確實在Google上搜尋過,但它只是問我是否是指“越界異常”)。是否有任何未處理的異常?還是只有某些類型的例外?再一次,最重要的是,在哪些現實世界場景中我可能需要“受約束的執行區域”?
由於我完全不了解這些概念,因此我不確定這個問題除了“.NET”之外還需要什麼標籤。
只是我對這些概念的理解:
關鍵部分- 正如你所說。
臨界區- 這似乎是“不要讓異常從執行緒中逃脫”的大圖版。
受約束的執行區域- 這是一種通過防止異常中斷來使一段程式碼或多或少具有原子性的方法。此頁面上的範例使用它來確保句柄的分配和儲存都被執行。請注意,沒有回滾,它更像是一個預防系統。
有一些“正常程式”的指導方針看起來有點像這樣,即當覆蓋 Equals 或隱式運算符時,你不應該拋出(任何東西)。
微軟可能對事物的定義不同,但總的來說,臨界區和臨界區是同一回事。
它們用於描述兩個或多個程序(或執行緒)正在訪問同一共享記憶體的區域,如果無法協調它們將導致競爭條件,從而阻止所需的執行行為,例如 Pétur 給出的遞增的經典範例並減少上面的變數。
可以在 Tanenbaum, AS 和 Bos, H. (2015) 中找到一個很好的討論。Modern Operating Systems (Pearson, Boston, Ma),第 4 版,第 1101 頁。早期版本以及提供作業系統課程材料的眾多大學的課程網站。