Windows上的互斥行为

时间:2012-08-23 22:12:42

标签: c++ windows mutex

我有以下代码......

在一台机器上抛出ERROR_ACCESS_DENIED,在另一台机器上抛出ERROR_ALREADY_EXISTS(Handle不为NULL)。我想了解为什么有两种不同的行为。在这两台计算机上,用户是本地系统管理员组的域用户部分。我试着同时运行三个实例。


#include <windows.h>
#include<iostream>
using namespace std;

void * _hMutex = NULL;

void createMyMutex()
{
    _hMutex = CreateMutex( 
            NULL,              // default security attributes
            false,             // initially not owned
            L"LockTest");      // named mutex

        if (_hMutex == NULL) 
        {
            cout<< GetLastError()<< " Error creating mutex handle"<<endl;
            Exit(0);
        }
        if(GetLastError() == ERROR_ALREADY_EXISTS)
        {
            cout<< GetLastError()<< " Mutex already created" <<endl;
        }   
}

void Lock()
{
    cout<<"Acquiring Lock..."<< endl;
    if(_hMutex != NULL)
        WaitForSingleObject(_hMutex, INFINITE);
    cout<< "Acquired Lock." <<endl;
}

void Unlock()
{
cout<< "Releasing Lock..." <<endl;
    if(_hMutex != NULL)
       ReleaseMutex(_hMutex);
}


int main(int argc, char* argv[])
{

    cout<<"Creating lock"<<endl;
    createMyMutex();
    cout<<"Lock create success"<<endl;

    cout<<"Taking lock"<<endl;
    Lock();
    cout<<"Got the lock"<<endl;

    cout<<"Waiting for 20 seconds"<<endl;
    Sleep(20000);
    cout<<"Wait over"<<endl;


    cout<<"Releasing lock"<<endl;
    Unlock();
    cout<<"Lock released successfully"<<endl;

    cout<<"exiting the program"<<endl;
    return 0;
    }

2 个答案:

答案 0 :(得分:3)

来自MSDN

  

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

因此,请尝试使用OpenMutex,而只使用SYNCHRONIZE访问权限。

另请注意,Windows类型BOOL与C ++类型bool不同。因此,在调用采用TRUE不是 FALSEBOOL的Windows API函数时,您应该使用相应的值truefalse

答案 1 :(得分:1)

我猜您在致电ERROR_ALREADY_EXISTS时收到createMyMutex();,拨打ERROR_ACCESS_DENIED时收到Lock();。我建议在全局命名空间中选择一个对象名。所以你最好使用像

这样的东西
CreateMutex( NULL, FALSE, "Global\\LockTest" );

有关详细信息,请参阅Object Namespaces on MSDN