我想有一个.exe运行的实例,我在app::InitInstance()
hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, _T("app.0"));
if (!hMutex)
hMutex = CreateMutex(0, 0, _T("app.0"));
在app::ExitInstance()
我有
int iii = ReleaseMutex(hMutex);
其中hMutex是一个全局变量:HANDLE hMutex;
这有效并且仅将应用限制为一个实例。但是,关闭后,我使用GetLastError()
收到以下消息:“尝试释放不属于调用者的互斥锁。”
答案 0 :(得分:1)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682411(v=vs.85).aspx
说明
如果调用线程不拥有,则ReleaseMutex函数将失败 互斥对象。
线程通过使用创建互斥锁来获取互斥锁的所有权 bInitialOwner参数设置为TRUE 或通过在a中指定其句柄 调用其中一个等待函数。当线程不再需要时 拥有互斥对象,它调用ReleaseMutex函数 另一个线程可以获得所有权。
线程可以指定它在调用其中一个时已拥有的互斥锁 等待函数而不阻止其执行。这可以防止a 线程来自死锁,同时等待它的互斥锁 已经拥有。但是,要释放其所有权,线程必须调用 ReleaseMutex每次获得所有权一次(或者 通过CreateMutex或等待函数)。
和
HANDLE WINAPI CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
_In_ BOOL bInitialOwner,
_In_opt_ LPCTSTR lpName
);
答案 1 :(得分:1)
在这种情况下,不需要拥有或释放互斥锁,因为您没有进行任何资源保护。但是,您可以在其上发出CloseHandle
- 这将减少引用计数,当最后一个句柄关闭时,互斥对象将被销毁。您也不需要调用它,因为操作系统会为您执行此操作(并且还会维护引用计数机制)。
然而,当第二个实例运行时(可能显示一个对话框),您可能需要尽快关闭它。在这种情况下,在显示对话框之前("另一个实例正在运行"),您必须关闭它。如果你不这样做,请考虑一个场景: