【问题标题】:Can somebody explain this remark in the MSDN CreateMutex() documentation about the bInitialOwner flag?有人可以在有关 bInitialOwner 标志的 MSDN CreateMutex() 文档中解释此评论吗?
【发布时间】:2011-02-27 08:12:23
【问题描述】:

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 函数。

【问题讨论】:

    标签: winapi


    【解决方案1】:

    使用 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!
    

    【讨论】:

    • 在我正在使用同一个进程的多个副本的情况下,需要通过此互斥锁同步它们的日志记录。我想要第一个开始清除日志的进程,所以我希望如果 bInitialMutex == TRUE 那么调用成功的进程(并且没有得到 ERROR_ALREADY_EXISTS)将是第一个进程。
    • 不错。在那种情况下,我同意你的看法:你的用例可能更简单,使用 bInitialMutex=TRUE,因为你确实想要一个不存在且我获得它的情况的特殊情况。
    【解决方案2】:

    该标志用于在拥有状态下创建互斥锁 - 成功的调用者将自动创建同步对象并在返回之前获取锁,以防调用者需要确定在创建之间不会形成竞争条件对象并获取它。

    您的协议将决定您是否需要在一个原子操作中执行此操作。

    【讨论】:

      【解决方案3】:

      嗯,不确定是否存在真正的问题。但是,如果您在 both 进程中将参数设置为 TRUE,那么您必须检查 GetLastError() 的值,以检查您是否真的拥有所有权。这将是先到先得。可能只有在您使用命名互斥体来实现单例流程实例时才有用。

      【讨论】:

        猜你喜欢
        • 2012-05-20
        • 2012-12-03
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        相关资源
        最近更新 更多