2012-08-16 85 views
0

假設我有一個共享對象,其中有一段代碼受關鍵部分保護,並且有多個線程正在訪問該對象以進行讀取/寫入。當線程在臨界區內時,其他線程正在等待。線程一旦離開CS,操作系統就可以訪問任何等待的線程。使用互斥鎖守護關鍵部分

如果我僅限於一個進程,那麼CS本身是否能夠很好地保護共享對象?

我問,因爲我已經看到了網絡,正確的方式做它是使用一個內核對象(例如:互斥,semaphone)看守CS。希望使用共享資源的線程需要首先使用WaitForSingleObject類型的函數獲取互斥/信號量。如果使用互斥鎖,那麼只有一個可以訪問資源。一旦獲得互斥體,線程進入CS,完成應該做的事情,然後離開CS並釋放互斥體。然後操作系統允許任何其他等待線程獲取互斥鎖等等。

但是是不是隻使用CS相同?

此外,使用互斥鎖應該比單獨使用CS慢得多。我看到的僅使用CS的唯一問題是,如果線程在CS內部崩潰,那麼其他線程可能永遠不會訪問共享資源。

有沒有其他理由爲什麼這種方法更好? 在此先感謝

+0

是否應該將其移至[計算機科學](http://cs.stackexchange.com/)? – Greg 2012-08-16 20:21:37

+0

我從來沒有見過任何代碼能夠完成您所說的所見過的任何代碼。你可以指向一些獲得互斥鎖或sempahore的代碼,然後獲得具有相同範圍的關鍵部分嗎?我懷疑你可能會誤解或誤解那些代碼,這就是你混淆的根源。 (也可能你混淆了術語「臨界區」的兩種不同用法,一種意思是特定的同步原語,另一種意思是代碼區域受類似互斥體同步保護的代碼區域) – 2012-08-16 20:24:08

+0

謝謝大衛,我的意思是CSection窗口結構(InitializeCS,EnterCS,LeaveCS,DeleteCS)。難道是我誤解了我讀的東西? – user1599391 2012-08-16 20:57:33

回答

2

這聽起來像你正在討論一些特定於Windows的術語,使它與一些通用的計算機科學術語混雜在一起。

在計算機科學中的術語「關鍵部分」被用於必須完全運行的代碼區域(通常是由於數據共享)。在Windows中,有一個名爲CRITICAL_SECTION的同步對象,可用於提供對執行區域的獨佔訪問。 Windows上的另一個對象屬性是它僅限於在單個進程中使用。

在計算機科學中,術語「互斥」通常用於描述可用於提供執行的並行或cncurrent線程之間同步的對象。在Windows中,還有一個互斥對象,可以使用CreateMutex()函數創建互斥對象(該對象返回表示互斥鎖的HANDLE)。該對象可以用於在相同或不同進程中的線程之間同步訪問,因此它可以以類似於CRITICAL_SECTION(但使用不同的API)的方式在很多方面使用。如果要同步處於不同進程中的執行線程,可以使用互斥對象,而對象不能。所以要回答你的問題(我認爲),如果你只關心保護作爲同一過程一部分的線程中的關鍵部分,則應該是足夠的。一個互斥對象可以用來代替,但它的性能可能會稍差一些。應該不需要使用這兩種類型的對象