2015-10-14 149 views
0

我讀過信號量和互斥量之間的差異之一是在互斥體的情況下,進程/線程(曾經有鎖)只能釋放鎖。但是在信號量的情況下,任何其他進程都可以釋放信號量。當一個沒有信號量的進程可以釋放信號量時,我就懷疑了。有一個信號量的用途是什麼?信號量和互斥鎖定概念

比方說,我有兩個進程A和B.假設進程A有一個信號量並執行一些關鍵任務。現在讓我們說過程B發送一個信號來釋放信號量。在這種情況下,即使正在執行某個關鍵任務,它也會處理A信號量嗎?

+0

請訪問以下鏈接http://koti.mbnet.fi/niclasw/MutexSemaphore.html,它具有與互斥 –

回答

-1

沒有「擁有」信號量之類的東西。信號量不像互斥體那樣擁有所有權。你所描述的代碼只會是越野車。如果您的代碼也有問題,互斥鎖將無法工作。

考慮一個信號量的最經典的例子 - 允許一段軌道上一次一列火車。如果火車是一個線程,你可以用一個互斥體來實現它。火車在上軌道之前會鎖定軌道互斥體,並在離開軌道後將其解鎖。

但是如果列車本身是多線程的呢?哪個線程應該擁有該軌道?

如果信號設備是線程而不是火車呢?在這裏,檢測進入軌道的列車的信號裝置必須鎖定軌道,而檢測離開軌道的列車的信號裝置必須解鎖它。

互斥鎖適用於短時間內某個特定線程擁有某些內容的情況。該線程可以「擁有」互斥量。信號量對於沒有線程擁有任何東西或沒有任何線程擁有的情況很有用。

+0

旗語很好的解釋與這個問題無關。 – SergeyA

+0

@SergeyA真的嗎?你能解釋一下你爲什麼這麼想嗎? (或者只是自己回答這個問題。)我理解他的問題是不理解如何擁有一個未被擁有的同步原語或爲什麼它不總是一個共享資源被一個線程不是鎖定它的那個線程。 –

+0

因爲你做出錯誤的類比,並且在適用性方面不正確。使用信號量進行線程同步是沒有問題的(只要你知道你在做什麼)。 – SergeyA

0

你正在半意義上。這不是關於所有權。例如,在我最喜歡的線程乒乓採訪問題中,可以使用信號量(和互斥)中的合作伙伴發佈。事實上,我已經特意嘗試在一次可用的3個實現(Linux/Solaris/AIX)上合作發佈互斥鎖,並且合作伙伴發佈爲互斥鎖按預期工作 - 即成功釋放了互斥鎖,並且線程阻止它恢復執行。但是,這當然是由Posix所禁止的。

0

我想你可能會混淆信號量和互斥量之間的整套差異。互斥體提供互斥。信號計數直到達到開始排除的水平。一個計算到一個的信號量會給一個互斥量類似的語義。

一個很好的例子就是電視機。只有很多人才能看到同一臺電視機,所以用信號燈來保護它是有道理的。任何人都可以停止看電視。電視機的遙控器一次只能由一個人操作,所以你可以用互斥體保護它。

一些閱讀...

https://en.wikipedia.org/wiki/Mutual_exclusion

https://en.wikipedia.org/wiki/Semaphore_%28programming%29

0

「比方說,我有兩個進程A和B.假設進程A是具有與其信號量並執行一些現在讓我們說過程B發送一個信號釋放信號量,在這種情況下,即使它正在執行一些關鍵任務,過程A是否會釋放信號量?「

一個關鍵點這裏要注意的是OS的內核。方法B不能將信號發送到程序中的‘釋放信號量’。它能做什麼是要求內核爲角色它訪問資源進程A已經請求內核和內核授予它訪問資源的權限 現在進程A完成它的工作之後,會讓內核知道它是用資源完成的,然後內核授予訪問權限到B.

「我懷疑當沒有信號量的過程與它可以釋放信號量。什麼是使用具有信號的?」

互斥和信號量之間的主要區別,一個信號串行訪問資源的多個實例。互斥做同樣的,當有一個實例該資源。

計數由內核信號量和互斥體的情況下,維持在這裏的計數爲1

考慮流程作爲客戶的一致在銀行等待的一個特例。 使用旗語類似於有多個出納員服務的情況 顧客。互斥體的使用類似於只有一個出納員的情況。

假設有進程A,B和C需要並行訪問資源(鎖,文件或內存中的數據結構等)。進一步假設有2個資源實例。因此,一次最多可以授予兩個進程訪問權限。

進程A根據所需的語義請求訪問資源的實例。這個對內核的請求包含數據結構來標識資源和實例的最大數目。2.內核創建一個計數爲2的信號量,授予對資源的訪問權並將計數遞減爲1,因爲現在只有一個其他進程可以獲得訪問權。

現在進程B通過遵循相同的語義請求訪問資源。內核授予它訪問權,並將計數遞減到0.

現在進程C請求訪問,但內核保持它處於等待狀態,因爲count爲0,並且不超過2個進程可以獲得併發訪問。

進程A與資源完成並讓內核知道。內核注意到這一點,並授予對正在等待的進程C的訪問權限。

在互斥體的情況下,內核一次只允許一個進程訪問資源。

0

正常的二進制信號量基本上用於同步。但是,互斥體是爲了獨佔訪問資源。互斥量是信號量的一個特殊變體,它一次只允許一個鎖櫃,並且對所有權更加嚴格,而不是正常的信號量,例如互斥量只能由獲取它的線程釋放。此外,請注意,如果是pthreads,快速互斥鎖可能不會檢查與所有權有關的錯誤,而錯誤檢查互斥鎖將返回錯誤。

對於與2進程A和B有關的查詢,進程A應該通過內核來密切注意它的關鍵工作,以便資源可以用於等待進程B。

你會發現在這個環節上過於一些相關信息: When should we use mutex and when should we use semaphore