操作系统:Windows语言:C / C ++
设计要求跨进程及其子进程使用互斥变量。 如果我在一个进程中创建互斥锁,我必须在另一个进程中打开互斥锁以检查临界区的可用性。 要打开互斥锁,我需要知道在父进程中创建的互斥锁的名称。假设,如果我将互斥锁作为我的应用程序名称。我可以知道互斥锁的名称,因为它是固定的。但是,如果我并行加载我的应用程序的第二个实例,则会出现混淆。
以下是更好的主意吗? 我有一个想法,将父进程中的互斥锁命名为进程ID。所以现在我需要从子进程/子进程中获取Parent的进程ID以打开互斥锁。 我想没有直接的方法从grand子进程中获取父进程id。所以我必须在每个创建进程api中传递进程id(在lpenvironment parm中)。
任何人都可以建议一种简单的方法,因为互斥量是最常用的....我是新手。
答案 0 :(得分:5)
主要想法很好,但你可以做一些实施调整。
首先,如果您的应用程序涉及多个进程协作,则生成子进程的主“控制器”进程可以通过命令行参数轻松传递其PID。如果子进程也生成自己的子进程,它们可以通过相同的机制传输PID。
进一步考虑这个想法,你也可以完全跳过PID,并通过命令行参数将互斥名称本身传递给子进程。这种方法的优点是父进程和子进程不需要包含从PID派生互斥锁名称的代码。通过传递互斥锁名称本身,您可以将子进程与必须知道它的生成方式分离。这种方法被许多主流应用程序使用,例如谷歌浏览器。
最后,您可以通过向互斥锁名称添加随机字符串(可能是GUID)来做得更好。我不相信任何人会用同一个名称命名他们自己的全局同步对象,但是一些额外的预防措施不会受到伤害。
答案 1 :(得分:0)
据我了解,您建议使用进程ID(PID)作为命名应用程序及其子进程使用的互斥锁的基础。这样,它们将拥有自己的互斥锁名称,该名称不会与应用程序的第二个实例使用的互斥锁名称冲突。
这似乎有效,但句柄比PID更可靠,因为PID可以被回收。在this StackOverflow thread上讨论了使用句柄的方法(将它们传递给子进程,类似于你提出的建议)。
我认为将您需要共享的信息传递给子进程是可行的方法。 Windows为控制台进程及其子进程提供了progress groups的概念,但这实际上是为了能够将所有进程作为一个组发送信号 - 而不是用于在组之间共享信息。
还有job objects用于管理属于公共作业的一组进程,但同样,这是为管理一组进程而设计的,而不是用于组内进程之间的信息共享。 / p>
答案 2 :(得分:0)
如果我解释“一个过程及其子过程”以及“子/孙”的措辞,那么情况就是你有一个单个父进程启动一个或多个子进程(或者,孩子们开始孙子孙女)。或者,这些的任意组合,但无论如何,每个过程我们都会讨论使用由父级创建的相同的互斥锁。
如果这个假设是正确的,为什么不只是使用一些令人尴尬的简单:
#define MUTEXNAME "MzdhYTYzYzc3Mzk4ZDk1NDQ3MzI2MmUxYTAwNTdjMWU2MzJlZGE3Nw"
如果你想知道这个来自哪里,我用这个单行代码生成它:
php -r "echo substr(base64_encode(sha1('some text')), 0, -2);"
在此刻,将“某些文字”替换为您的姓名,当前日期或任何随机字样。系统上任何其他应用程序具有相同互斥锁名称的可能性几乎为零。