C++ 如何等待直到互斥锁解锁?
有一个互斥量数组。 我的职能:C++ 如何等待直到互斥锁解锁?,c++,multithreading,winapi,C++,Multithreading,Winapi,有一个互斥量数组。 我的职能: 检查互斥锁是否已锁定 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)) !=
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
之前创建的,这对我不起作用
谢谢。您确实需要理清代码的逻辑:互斥体的创建和锁定/解锁是不同的操作,应该这样对待。坦率地说,所有这些“试图创建已经创建的互斥体”的业务都没有多大意义 简而言之:
当你试图锁定一个已经被其他人锁定的互斥锁时,你的线程会自动阻塞,直到互斥锁可用。对于posix线程,你可能会使用;我不知道WinAPI是否提供了类似的功能。如果您想等到它解锁后才锁定它,那么您可以锁定它。这正是你这样做的结果。当您尝试锁定时,代码将阻塞,直到互斥锁可用,然后锁定它。
处理互斥锁[N]
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]);
}
}
void initmutex(int N)
{
对于(int i=0;i
希望有帮助。我以为CreateMutex的意思是锁定它。我没有找到“LockMutex”函数或其他东西。@fogbit:没有,CreateMutex初始化互斥体。WaitForSingleObject将其锁定。查看我的更新答案。我不知道如何锁定它。我认为“创建互斥”意味着“锁定”它。如果没有,我如何在winapi中锁定它?这就是
WaitForSingleObject
所做的。