Windows上的互斥行为

我有下面的代码…

在一台机器上,它会抛出ERROR_ACCESS_DENIED,并在其他机器上抛出ERROR_ALREADY_EXISTS(句柄不为NULL)。 我想了解为什么两种不同的行为。 在这两台机器上,用户是本地系统pipe理员组的域用户部分。 我试着同时运行三个实例。


#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_EXISTSbInitialOwner将被忽略,并且调用线程不被授予所有权。 但是,如果调用者具有有限的访问权限,则该函数将因ERROR_ACCESS_DENIED而失败,调用者应该使用OpenMutex函数。

所以请尝试使用OpenMutex而不要使用SYNCHRONIZE访问权限。

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

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

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

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