加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何等到互斥锁解锁?

发布时间:2020-12-16 10:50:53 所属栏目:百科 来源:网络整理
导读:有一系列互斥体. 我的功能: 检查是互斥锁被锁定 2A.如果没有,那么锁定它 2B.如果已锁定,请等待解锁并将其锁定 另一个功能解锁它. 问题是我在等待部分遇到了崩溃: HANDLE mutexes[N];void func(int i){ // (*) wait until unlocked or create if unlocked w
有一系列互斥体.
我的功能:

>检查是互斥锁被锁定

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();

我试图将它包装在一个关键部分并获得相同的结果.我确信我在正确的范围内.
我不能使用Boost / pThreads / etc.

我知道我的问题很简单,但我找不到解决方案.在所有示例中,我都看到在WaitForSingleObject之前创建了一个互斥锁,这对我来说不起作用.

谢谢.

解决方法

你真的需要理清代码的逻辑:互斥体的创建和锁定/解锁是不同的操作,应该这样对待.坦率地说,所有这些“尝试创建已经创建的互斥体”的业务并没有多大意义.

简述:

> CreateMutex初始化(“创建”)互斥锁.
> WaitForSingleObject等人锁定互斥锁(或超时).
> ReleaseMutex解锁它.
> CloseHandle摧毁它.

您可以创建/销毁互斥锁??一次,并在锁定/解锁之间任意多次.

当您尝试锁定已被其他人锁定的互斥锁时,您的线程会自动阻塞,直到互斥锁变为可用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读