Windows 上的互斥行为

Mutex behavior on Windows

本文关键字:Windows      更新时间:2023-10-16

我有以下代码...

在一台计算机上,它抛出ERROR_ACCESS_DENIED,而在另一台计算机上,它抛出ERROR_ALREADY_EXISTS(句柄不是 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;
    }

来自 MSDN:

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

因此,请尝试仅使用SYNCHRONIZE访问权限的OpenMutex

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

我猜你在呼叫createMyMutex();时得到ERROR_ALREADY_EXISTS,在呼叫Lock();时得到ERROR_ACCESS_DENIED。我建议在全局命名空间中选择一个对象名称。所以你最好使用类似的东西

CreateMutex( NULL, FALSE, "Global\LockTest" );

有关详细信息,请参阅 MSDN 上的对象命名空间。