2011-03-16 85 views
3

操作系統:Windows語言:C/C++跨進程使用互斥鎖

設計要求跨進程及其子進程使用互斥變量。 如果我在一個進程中創建互斥鎖,我必須在另一個進程中打開互斥鎖來檢查關鍵部分的可用性。 要打開互斥鎖,我需要知道父進程中創建的互斥鎖的名稱。假設,如果我將互斥鎖作爲我的應用程序名稱。我可以知道互斥體的名稱,因爲它是固定的。但是,如果我平行載入我的應用程序的第二個實例,則會出現混淆。

以下是更好的主意嗎? 我有一個想法,將父進程中的互斥量命名爲進程ID。所以現在我需要從子進程/宏子進程中獲取父進程ID來打開互斥鎖。 我想沒有直接的方法來從宏子進程中獲取父進程ID。所以我必須在每個創建過程API(在lpenvironment parm)中傳遞進程ID。

任何人都可以提出一個簡單的方法,因爲互斥是最常用的....我是一個新手。

+0

一些資源:http://www.cs.cf.ac.uk/Dave/C/node31.html#SECTION003110000000000000000,http://www.cfanatic.com/topic132/ – fsonmezay 2011-03-16 14:41:04

回答

5

主要想法很好,但你也許可以做一些實施調整。例如,如果您的應用程序涉及多個進程協作,那麼派生子進程的主「控制器」進程可以通過命令行參數輕鬆傳遞其PID。如果子流程也產生他們自己的孩子,他們可以通過相同的機制傳遞PID。

進一步考慮這個想法,您也可以完全跳過PID,並通過命令行參數將互斥體名稱本身傳遞給子進程。這種方法的優點是父進程和子進程不需要都包含從PID派生互斥體名稱的代碼。通過傳遞互斥體名稱本身,可以將子流程與必須知道它的生成方式分離開來。這種方法被許多主流應用使用,例如谷歌瀏覽器。

最後,你可以做一個隨機字符串(一個GUID可能?)給互斥體名稱做得更好。我不相信任何人會用同樣的名字命名他們自己的全局同步對象,但是一些額外的預防措施不會受到傷害。

+1

命令行參數或環境變量都是傳遞獨特互斥名稱的合理方式。 – 2011-03-16 15:04:21

0

據我所知,您建議使用進程ID(PID)作爲命名應用程序及其子進程使用的互斥體的基礎。這樣,他們將擁有自己的互斥體名稱,它不會與您的應用程序的第二個實例使用的互斥體名稱發生衝突。

這似乎有效,但處理將比PID更可靠,因爲PID可以循環使用。在this StackOverflow thread上討論了使用句柄的方法(將它們傳遞給子進程,類似於您所建議的)。

我認爲將需要共享的信息傳遞給子進程是一種方式。 Windows對於控制檯進程及其子進程具有progress groups的概念,但這實際上是爲了能夠將所有進程表示爲一組 - 而不是用於在組之間共享信息。

而且還有job objects用於管理屬於共同作業的一組進程,但同樣,這是爲管理一組進程而設計的,而不是用於組中進程之間的信息共享。

+0

如果所有進程都位於父進程創建的新進程組中,那麼只有該進程組中的所有進程都已終止,pid才能被回收。 – 2011-03-16 15:56:49

0

如果我解釋「過程及其子過程」以及「子/孫」的措詞,情況是您有一個啓動一個或多個孩子(或孩子啓動孫子)。或者,這些的任意組合,但無論哪種方式,過程我們談論使用相同的互斥由父級創建。

如果這種假設是正確的,爲什麼不使用的東西是令人尷尬的簡單:

#define MUTEXNAME "MzdhYTYzYzc3Mzk4ZDk1NDQ3MzI2MmUxYTAwNTdjMWU2MzJlZGE3Nw" 

如果你想知道這個是從哪裏來的,我這一個班輪生成它:

php -r "echo substr(base64_encode(sha1('some text')), 0, -2);" 

用你的名字,當前日期或任何隨機詞語在你的腦海中取代'某些文字'。系統中任何其他應用程序擁有相同的互斥量名稱的機會幾乎爲零。

+0

我認爲提問者想要支持有兩個父進程的場景。每個人都需要擁有自己獨有的互斥體名稱,只有它的「後代」進程才能知道。這就是爲什麼他/她想要爲已知/僅與其後代共享的父級生成互斥體名稱。 – 2011-03-16 15:17:09

+0

在這種情況下,我仍然會創建一個隨機字符串(儘管在運行時),將其用作名稱,並將其放在命令行中。僅僅因爲它很簡單(簡單就好!),並且不會失敗。但是可以肯定的是,使用pid(加上'供應商'ID來使其獨特以防別人有想法使用4位整數)也可以。 – Damon 2011-03-16 16:18:12