我有兩個程序,X是用戶與之交互的正常程序,Y程序清理了Y程序獲取的資源。可以有多個X實例,但只有一個Y (我已經用名爲mutexes解決了這個部分)。現在,由於Y是一個清理程序,它應該被阻塞,直到X的最後一個實例消失。等待程序的最後一個實例
我試過使用一個信號燈,但我無法弄清楚。有人能幫助我嗎?
我有兩個程序,X是用戶與之交互的正常程序,Y程序清理了Y程序獲取的資源。可以有多個X實例,但只有一個Y (我已經用名爲mutexes解決了這個部分)。現在,由於Y是一個清理程序,它應該被阻塞,直到X的最後一個實例消失。等待程序的最後一個實例
我試過使用一個信號燈,但我無法弄清楚。有人能幫助我嗎?
一個信號量是一個這樣做的有效方式,但不一定是最好的。每當程序X啓動時,請致電ReleaseSemaphore
。每當進程終止時,在信號量句柄上以超時0調用WaitForSingleObject
(確保也包含在異常處理程序中,以防程序崩潰)。
過程Y可以定期輪詢WaitForSingleObject
,然後以零(或幾毫秒)超時。如果返回值是WAIT_OBJECT_0
,它必須立即再次釋放信號量(否則它會阻止最後一個X進程試圖退出!)。如果返回值爲WAIT_TIMEOUT
,則不再有X個進程。當然
的最佳的解決辦法是從Y.推出的所有X進程在這種情況下,Y可以只WaitForMultipleObjects
對工藝處理,它從CreateProcess
得到,沒有額外的「如果和whens」。這將永遠「正常工作」。它也更有效率。
這導致了第二個最佳解決方案...使用OpenProcess
和WaitForMultipleObjects
處理正在運行的進程。問題是從哪裏獲取進程ID。共享內存區域可能會做,管道可能會這樣做,或者CreateToolhelp32Snapshot
可能會爲您提供該信息。
另一種方法是使用命名的互斥體對象。所有流程X請致電CreateMutex
。如果互斥量已經存在,則不會造成任何危害(GetLastError將返回ERROR_ALREADY_EXISTS
,但是如此)。如果進程終止或崩潰,所有打開的句柄都關閉,因此互斥量引用計數遞減。
Y進程調用OpenMutex
。這要麼成功要麼失敗。如果成功,它會再次關閉手柄,睡覺並再次嘗試。如果失敗,則沒有單個X進程正在運行。
另一種方式(雖然它可能有種族問題)將創建一個命名的共享內存段,並在進程X啓動和退出時調用InterlockedIncrement
和InterlockedDecrement
。如果共享內存對象無法打開或計數器爲零,則進程Y知道沒有X進程正在運行。