有人可以解释 MSDN CreateMutex() 文档中有关 bInitialOwner 标志的评论吗?

2023-12-29

MSDN CreatMutex() 文档(http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx 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 将两个步骤合二为一:创建互斥体和获取互斥体。如果多人可以同时创建互斥体,则第一步可能会失败,而第二步可能会成功。

正如其他回答者提到的,这不是strictly一个问题,因为你会得到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!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有人可以解释 MSDN CreateMutex() 文档中有关 bInitialOwner 标志的评论吗? 的相关文章

随机推荐