我有一個公共資源,我想要1,並且只有1個我的應用程序實例(或它的COM API)可以隨時訪問。我試圖使用互斥體來保護這個資源,但是當一個主機dotnet應用程序的多個線程嘗試訪問COM對象時,互斥體似乎不會被釋放。這是我用來保護我的資源的代碼。如何使用互斥鎖保護公共資源?
repeat
Mutex := CreateMutex(nil, True, PChar('Connections'));
until (Mutex <> 0) and (GetLastError <> ERROR_ALREADY_EXISTS);
try
//use resource here!
finally
CloseHandle(Mutex);
end;
如果我同時運行的線程,第一個線程通過獲得的(當然,是第一個創建互斥),但隨後的線程都陷入重複循環。如果我以5秒的間隔運行每個線程,則一切正常。
我懷疑我在這裏沒有正確使用互斥鎖,但是我發現關於如何做到這一點的文檔很少。
任何想法?
我應該補充說,這隻適用於將CreateMutex的第二個參數設置爲True的情況。否則,我會遇到和以前一樣的問題,每個掛起的線程都在等待對方。 – Steve 2010-03-18 16:17:13
奇怪。 WaitForSingleObject調用應該爲你獲取互斥量。 MSDN示例也使用False:http://msdn.microsoft.com/en-us/library/ms686927%28VS.85%29.aspx – 2010-03-18 17:33:18
克雷格是正確的。我的建議是*從不*通過'真'的第二個參數。原因是當函數返回時,你不知道你是否真的擁有互斥鎖。而且,在創建時,您可能不需要擁有互斥量。當程序啓動時,創建一次*互斥*。然後在程序運行時獲取並釋放它。當程序終止時,關閉手柄。每次需要擁有它時,不要創建並銷燬互斥鎖。 – 2010-03-18 20:31:30