如何等待直到互斥锁解锁
How to wait until mutex unlocked?
存在一个互斥体数组。我的功能:
- 检查互斥锁是否被锁定
2 a。如果没有,则锁定它
2 b。如果锁定,等待解锁并锁定
另一个函数将其解锁。
问题是我在等待区崩溃了:
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/等
WaitForSingleObject
之前创建互斥锁,这对我来说不起作用。
谢谢。
您确实需要理清代码的逻辑:创建互斥锁和锁锁是不同的操作,应该这样对待。坦率地说,所有这些"试图创建已经创建的互斥锁"的事情并没有多大意义。
简要:
-
CreateMutex
初始化("创建")互斥锁 -
WaitForSingleObject
et al锁定互斥锁(或超时)。 -
ReleaseMutex
解锁 -
CloseHandle
破坏它。
创建/销毁互斥锁一次,在此期间可以任意多次锁定/解锁互斥锁。
当你试图锁定一个已经被别人锁定的互斥锁时,你的线程会自动阻塞,直到互斥锁可用。
如果您想等到解锁后再锁定它,那么您可以直接锁定它。这就是你这么做的结果。当您尝试锁定时,代码会阻塞,直到互斥量可用,然后锁定它。
对于posix线程,您可能会使用条件变量;我不知道如果WinAPI提供类似的东西
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]);
}
}
希望对你有帮助。
相关文章:
- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- C++线程:等待condition_variable后无法解锁阵列中的互斥锁
- C++ 在调用 std::unique_lock 等待之前解锁 std::mutex
- 等待另一个进程锁定然后解锁 Win32 互斥锁
- 互斥锁如何在低级别等待解锁
- Boost::interprocess::interprocess_condition::wait在等待时不会自动解锁互
- 如何等待直到互斥锁解锁