Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 使用安全吗;扔;在win32中不释放互斥?_Winapi_Mutex_Throw - Fatal编程技术网

Winapi 使用安全吗;扔;在win32中不释放互斥?

Winapi 使用安全吗;扔;在win32中不释放互斥?,winapi,mutex,throw,Winapi,Mutex,Throw,首先,我对它进行了测试,效果很好。 我想知道它是否正确 funcA() { DWORD res = WaitForSingleObject(mutex, INFINITE); if (aaa != bbb) throw "aaa"; ReleaseMutex(mutex); } WaitForSingleObject始终返回“0”,而不是“WAIT_放弃”或任何其他错误代码。 我只是找不到任何描述互斥的文档会在“throw”上发布 谢谢不,互斥锁不会在抛出时释放

首先,我对它进行了测试,效果很好。 我想知道它是否正确

funcA() {  
    DWORD res = WaitForSingleObject(mutex, INFINITE);
    if (aaa != bbb) throw "aaa";

    ReleaseMutex(mutex);
}
WaitForSingleObject始终返回“0”,而不是“WAIT_放弃”或任何其他错误代码。 我只是找不到任何描述互斥的文档会在“throw”上发布


谢谢

不,互斥锁不会在抛出时释放

但是,您可以构建自己的
Lock
类来锁定构造函数上的互斥锁,并在其析构函数上释放互斥锁。然后,如果在函数中使用
Lock
对象(使用内存堆栈而不是堆),则可以确保调用该对象的析构函数并释放互斥锁


这正是该类在MFC中所做的。

除非在析构函数或catch块中隐式调用release,否则它不会这样做。您是否显示了描述它所需的全部代码?

如果您每年从同一线程调用funcA(),则这是预期的行为-由于Windows互斥体是递归的,因此会返回WAIT\u OBJECT\u 0。如果您第二次从另一个线程调用funcA(),我希望在第一个线程释放互斥锁之前,调用都会被阻止。您是对的。我正在使用xmlrpc库,我认为有多个线程用于处理请求,但只有一个线程。所以,这是预期的行为,我的互斥是不必要的!:)另外,ATL中的CCOMAuthoricalSection和CCOMCriticalSection锁定。