2010-05-02 49 views

回答

4

如果你想要這個值用於外部監測(如你在你的評論中所建議的那樣),那麼在致電ReleaseSemaphore()或者恕我直言之後,要麼使用先前的值,更好的解決方案是除了信號量之外,還要實現自己的「互鎖」計數器;那麼你有你的監控計數,可以在你喜歡的任何方式訪問它......只要不使用它,如果你可以「進入」的信號看到的一種方式......

正如克里斯說得好,你無法獲得當前計數,因爲它可能會一直在變化。

+0

如果在訪問信號量之前用實際鎖定替換包裝的互鎖解決方案,則可以使用計數,只要您喜歡。 – chacham15 2014-01-11 19:07:55

2

有沒有這樣的東西作爲一個Win32信號的「當前計數」 - 這就是爲什麼你不能得到它。

我的意思是,在某個時刻,信號量的計數將會是一些值,但是從線程的角度來看,除非它採取措施來增加或減少信號計數,否則另一個線程可能會任何答案檢索完全無效的時刻計算。

正是出於這個原因,Windows API的同步功能,不要讓你把以前的鎖計數無副作用。副作用保證您有一個有效的機會窗口,以有意義的方式實際使用該值。


明顯的 「解決辦法」 將做類似

LONG count = 0; 
if(WAIT_OBJECT_0 == WaitForSingleObject(hSemaphore,0L)) 
{ 
    // Semaphores count is at least one. 
    ReleaseSemaphore(hSemaphore,1,&count); 
} 

這是爲什麼好?我不確定。但是如果ReleaseSemaphore被允許釋放0,那麼或許在等待和釋放之間做一些有意義的事情是可能的。

+3

這種能力對於外部監測很有用(例如,生產者和消費者的信號量計數表示仍待處理的對象的數量)。 因此,我很驚訝,它是可撤銷的。 – 2010-05-02 19:34:47

+0

解決方法的問題是它可能會歪曲實際使用信號量;您可能會將等待引入正在使用信號量用於預期目的的線程。引入的等待會很小,但可能足以導致上下文切換。最好只保留自己的監測計數器。 – 2010-05-03 19:51:59

2

Sysinternals的工具進程瀏覽器可以顯示的win32手柄,包括信號量和它們的當前/最大計數的內部結構。對於調試而言足夠好,但對自動化監控不太有用。

如果進程資源管理器可以做到這一點,你可能太...但它可能會需要Windows內部的深入瞭解。

4

這可能有點爲時已晚,但我認爲NtQuerySemaphore()可能是你想看看是什麼。

+0

https://stackoverflow.com/questions/2579536/semaphores-values – 2017-09-15 15:17:35

相關問題