14

這些實際上是三個不同的概念還是我混亂? (我一直在閱讀有關線程和垃圾收集物品一起,混淆了自己。)「關鍵部分」,「關鍵區域」和「約束執行區域」之間的區別

「臨界區」 - 我想這可能只是對於你不想多線程的代碼段術語同時訪問,即內部鎖和Monitor.Enter/Exit語句?

「關鍵區域」 - 這裏沒有真正的線索 - MSDN說的是「這告訴主機,該部分中引發的異常可能會產生更廣泛的影響」。而且「CLR的主機,例如Sql Server」可以選擇「以不同方式」處理在關鍵區域內拋出的異常。不同的是如何?爲什麼?而且,最重要的是,在我需要將代碼標記爲關鍵區域的現實世界場景中,

「受限制的執行區域」 - 我在閱讀垃圾回收文章中的CriticalFinalizerObject時發現了這個問題。

從MSDN我可以理解的是,這些區域之一的代碼在某種程度上可以保證運行(但是如何?),因此不得拋出「帶外」異常。

什麼是out-of-band exception? (我做過谷歌這個,但它只是問我是否意味着「越界異常」)。

是否有任何未處理的異常?還是隻有某些類型的異常?而且,最重要的是,在真實世界的場景中,我可能需要一個「受限制的執行區域」嗎?

因爲我不太瞭解這些概念,所以我不確定這個問題除了「.NET」之外還需要什麼標籤。

+0

我很確定你對關鍵部分的理解是正確的。 – Brian 2009-04-14 13:32:35

+0

這是一個開始:)。我不確定我是否使用了正確的術語。我在關於鎖定的文章中看到了「關鍵部分」。我只在Thread.BeginCriticalRegion的MSDN頁面中看到「Critical Region」。我知道「受限制的執行區域」是因爲它有一個MSDN頁面。 – 2009-04-14 13:46:27

回答

5

只是我對這些概念的理解:

臨界區 - 如你所說。

關鍵區域 - 這似乎是「不讓異常從線程中逃脫」的大圖片版本。

約束執行區域 - 這是一種通過防止異常中斷來使代碼片段更原子化的方法。 example on this page使用它來確保執行句柄的分配和存儲。請注意,沒有回滾,這更像是一個預防性系統。

「正常編程」的指導方針看起來有點像這樣,即當重寫Equals或隱式操作符時,不應該拋出(任何東西)。

+0

對不起,謝謝。 +1,我接受這個描述並鏈接到示例組合。我真的希望對「關鍵區域」有詳細的瞭解,究竟是一個什麼樣的帶外例外,但我可能不應該提出多個問題。 – 2009-04-15 08:01:29

+2

帶外異常是一種異常,不是由當前直接執行的代碼拋出,而是由框架的一部分拋出。此術語包含以下例外:StackOverflowException,OutOfMemoryException和ThreadAbortException。 – 2010-08-11 21:09:00

2

根據由Joe達菲在Windows併發編程爲臨界區/區域中的定義如下:

臨界區:在Win32關鍵部分是一個簡單的數據結構(CRITICAL_SECTION)用於構建關鍵區域。

關鍵區域:是一個代碼區域,享有互斥(這似乎是你所指的是上面的關鍵部分)。

+0

感謝您的迴應。 「關鍵部分」來自http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx。和「關鍵區域」來自http://msdn.microsoft.com/en-us/library/system.threading.thread.begincriticalregion.aspx。也許「關鍵地區」,因爲我列出它不是一個真正的概念? – 2009-04-14 14:02:41

0

在Windows中,目前爲止我只使用臨界區。 據我的經驗,它是一個Win32用戶空間線程鎖定機制。這意味着它可以在一個進程中用於鎖定多個線程共享的資源。這不是全系統的,只是整個過程。內核空間鎖(例如互斥鎖)就是一個例子。

例如,boost :: thread在其Win32實現中使用了關鍵部分 - 或者至少在我使用它的時候 - 而且在Linux中通過pthreads使用了互斥體。

0

在另一個進程可以輸入之前,應由每個進程開始的代碼的任何部分都稱爲關鍵區域。

0

關鍵部分:是一段代碼。每個進程都有一個關鍵部分,其中交換comon變量,更新表,寫入文件和......重要的特徵是,當一個進程在其臨界區執行時,不允許其他進程進入其臨界區並提供手動排除。當然,爲了達到這個目的,當出現'n'個進程時,使用稱爲「信號量」的同步工具。信號量是一個可變的整數。

關鍵區域:是一種同步構造,它可以防止與信號量解決方案相關的某些簡單錯誤,從而解決程序員可能犯的關鍵部分問題。

1

關鍵部分一組指令,其中一些指令訪問共享對象。

暫時忽略ProcessA和ProcessB可以同時執行。如果ProcessA或ProcessB要被許多不同的線程同時執行,您不會想要依賴x的值,因爲它很可能會導致競爭條件。

在這個例子中,兩個while循環是臨界區。

int x = 0; 
Process A() { 
    while(true) { 
     x++; 
     x--; 
    } 
} 
Process B() { 
    while(true) { 
     x++; 
     x--; 
    } 
} 

臨界區一組關鍵部分。

現在假設您可以同時執行ProcessA和ProcessB。每個流程都有一個關鍵部分。兩個部分共享相同的變量(x)。兩個關鍵部分一起構成了一個關鍵區域。爲什麼這很重要?如果您認爲ProcessA的關鍵部分被互斥排除,則您仍然會在x中得到不正確的結果,因爲ProcessB不遵守互斥。您需要在關鍵區域實施相互排斥,在組成該區域的每個關鍵部分實施。

0

微軟可以有不同定義的東西,但在一般情況下,關鍵區域關鍵部分同樣的事情

它們被用來描述區域,其中兩個或更多個進程(或線程)被訪問相同的共享存儲器,和失敗座標它們將導致競爭條件防止所需在執行中的行爲,比如Pétur給出的用於遞增和遞減變量的典型例子。

一個很好的討論可以在Tanenbaum,A. S.和Bos,H。(2015)中找到。 現代操作系統(Pearson,波士頓,麻省),第4版,第1101頁。早期版本以及衆多大學的課程網站,它們爲其操作系統課程提供材料。