有一系列互斥锁。 我的功能:
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);
}
在(*)点我遇到了崩溃 - 访问冲突。当它试图创建之前已经创建的互斥锁[i]时发生崩溃。我不能使用WaitForSingleObject,因为第一次没有创建互斥锁[i],文档说WaitForSingleObject未定义。此外,如果我使用此功能,我也会遇到同样的崩溃。
我需要的只是这种简单伪代码的模拟
if (mutex_has_been_created[mutexes[i]])
WaitUntilRelease()
CreateMutex();
我试图将它包装在关键部分并获得相同的结果。我确信i
在正确的范围内。
我不能使用Boost / pThreads / etc。
我知道我的问题很简单,但我找不到解决方案。在所有示例中,我都看到在WaitForSingleObject
之前创建了一个互斥锁,这对我不起作用。
谢谢。
答案 0 :(得分:15)
您确实需要理清代码的逻辑:互斥锁的创建和锁定/解锁是不同的操作,应该这样对待。坦率地说,所有这些“尝试创建已经创建的互斥体”的业务并没有多大意义。
简言之:
CreateMutex
初始化(“创建”)互斥锁。WaitForSingleObject
等锁定互斥锁(或超时)。ReleaseMutex
解锁。CloseHandle
摧毁它。您可以创建/销毁互斥锁一次,然后在锁定/解锁之间多次。
当您尝试锁定已被其他人锁定的互斥锁时,您的线程会自动阻塞,直到互斥锁变为可用。
答案 1 :(得分:4)
如果你想要等到它解锁,只能锁定它,那么你就可以锁定它。这正是你这样做时会发生的事情。当您尝试锁定时,代码会阻塞,直到互斥锁变为可用,然后将其锁定。
答案 2 :(得分:1)
使用posix线程你可能会使用condition variables;我不知道WinAPI是否提供类似的东西。
答案 3 :(得分:1)
HANDLE mutexes[N]
void InitMutexes(int N)
{
for (int i =0; i < N ; i++)
{
mutexes[i] = CreateMutex( NULL, FALSE, NULL);
}
}
void WaitForMutex(int n)
{
WaitForSingleObject(mutexes[n], INFINITE);
}
void ReleaseMutex(int n)
{
ReleaseMutex(mutexes[n]);
}
void CleanUpMutexes(int N)
{
for (int i=0; i < N; i++)
{
ReleaseMutex(mutexes[i]); CloseHandle(mutexes[i]);
}
}
希望有所帮助。