fog*_*bit 3 c++ winapi multithreading
有一系列互斥体.我的功能:
2A.如果没有,那么锁定它
2B.如果已锁定,请等待解锁并锁定它
另一个功能解锁它.
问题是我在等待部分遇到了崩溃:
HANDLE mutexes[N];
void func(int i)
{
// (*) wait until unlocked or create if unlocked
while ((mutexes[i] = CreateMutex(NULL, TRUE/*same with FALSE*/, NULL)) != NULL);
/*or WaitForSingleObject(mutexes[i], INFINITE)*/
mutexes[i] = CreateMutex(NULL, TRUE, NULL);
}
Run Code Online (Sandbox Code Playgroud)
在(*)点,我遇到了崩溃 - 访问冲突.当它试图创建之前已经创建的互斥锁[i]时发生崩溃.我不能使用WaitForSingleObject,因为第一次没有创建互斥锁[i],文档说WaitForSingleObject未定义.此外,如果我使用此功能,我会得到同样的崩溃.
我只需要这种简单伪代码的模拟
if (mutex_has_been_created[mutexes[i]])
WaitUntilRelease()
CreateMutex();
Run Code Online (Sandbox Code Playgroud)
我试图将它包装在一个关键部分并获得相同的结果.我确信这i是在正确的范围内.我不能使用Boost/pThreads/etc.
我知道我的问题很简单,但我找不到解决方案.在所有示例中,我都看到过之前创建了一个互斥锁WaitForSingleObject,这对我来说不起作用.
谢谢.
NPE*_*NPE 15
你真的需要理清代码的逻辑:互斥体的创建和锁定/解锁是不同的操作,应该这样对待.坦率地说,所有这些"尝试创建已经创建的互斥体"的业务并没有多大意义.
简述:
CreateMutex 初始化("创建")互斥锁.WaitForSingleObject 等人锁定互斥锁(或超时).ReleaseMutex 解锁它.CloseHandle 摧毁它.您可以创建/销毁互斥锁一次,并在锁定/解锁之间任意多次.
当您尝试锁定已被其他人锁定的互斥锁时,您的线程会自动阻塞,直到互斥锁变为可用.
如果你想等到解锁后才锁定它,那么你可以直接锁定它。当你这样做时,就会发生这样的情况。当您尝试锁定时,代码会阻塞,直到互斥体变得可用,然后锁定它。