MSDN CreatMutex()文档(http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx)在结尾处包含以下注释:


两个或多个进程可以调用CreateMutex来创建相同的命名互斥体。第一个进程实际上创建了互斥锁,具有足够访问权限的后续进程仅打开了现有互斥锁的句柄。这使多个进程可以获取同一个互斥锁的句柄,同时使用户不必承担确保首先启动创建进程的责任。使用此技术时,应将bInitialOwner标志设置为FALSE。否则,可能很难确定哪个过程具有初始所有权。


有人可以使用bInitialOwner = TRUE解释问题吗?

在同一文档的较早版本中,它建议调用GetLastError()将允许您确定对CreateMutex()的调用是创建互斥锁还是只是将新句柄返回给现有互斥锁:


返回值

如果函数成功,则返回值是新创建的互斥对象的句柄。

如果函数失败,则返回值为NULL。若要获取扩展的错误信息,请调用GetLastError。

如果互斥锁是命名的互斥锁,并且该对象在此函数调用之前存在,则返回值是现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS,bInitialOwner被忽略,并且未授予调用线程所有权。但是,如果调用方的访问权限受到限制,则该函数将失败并显示ERROR_ACCESS_DENIED,并且调用方应使用OpenMutex函数。

最佳答案

使用bInitialOwner将两个步骤合而为一:创建互斥锁和获取互斥锁。如果可以同时创建多个人,则第一步可能会失败,而第二步可能会成功。

正如其他答复者提到的那样,这完全不是问题,因为如果其他人首先创建它,则会得到ERROR_ALREADY_EXISTS。但是,然后您只能使用错误代码来区分“无法创建或找到互斥锁”和“无法获取互斥锁;请稍后重试”的情况。这将使您的代码难以阅读并且更容易搞乱。

相反,当bInitialOwner为FALSE时,流程要简单得多:

result = create mutex()
if result == error:
   // die
result = try to acquire mutex()
if result == error:
   // try again later
else:
   // it worked!

08-06 14:13