VC ++,互斥锁,但执行重复

时间:2018-06-21 00:38:40

标签: visual-c++ mutex

项目有两个应用程序。

  1. Windows常规程序
  2. Windows服务程序

服务程序运行常规程序。但是有时普通程序会执行重复操作。SYSTEM帐户和USERS帐户两件事。 我使用了此源代码,并且可在所有Windows版本上使用。

 auto const MutexName = L"Global\\Test_SingleInstance";

    if (NULL == ::OpenMutex
        ( MUTEX_ALL_ACCESS
        , FALSE
        , MutexName))
    {
        duplicationPreventor = ::CreateMutex
            ( NULL
            , FALSE
            , MutexName
            );

        if (NULL == duplicationPreventor)
        {
            Log("Could not guarantee single instance.");
            return false;
        }
    }
    else
    {
        Log("There is existing instance.");
        return false;
    }

为什么会出现此问题?

请让我知道。

1 个答案:

答案 0 :(得分:0)

您有比赛条件,或者确切地说是Time of check to time of use问题。如果两个实例几乎同时运行此代码,则两个实例都会从NULL获得OpenMutex,然后两个实例都将以CreateMutex成功。

正确的方法是立即致电CreateMutex,然后致电GetLastError检查ERROR_ALREADY_EXISTS