首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查线程在锁定前是否已经锁定互斥对象

检查线程在锁定前是否已经锁定互斥对象
EN

Stack Overflow用户
提问于 2012-02-01 12:43:23
回答 5查看 3.3K关注 0票数 0

在线程锁定互斥锁之前,我想检查它是否已经对互斥锁有了锁,所以我无法执行这个

代码语言:javascript
运行
复制
Acquire mutex
Acquire mutex

// do something here

Release mutex

// still has mutex lock at this point!!

我知道我可以在这里喝一杯,但我想知道是否有什么东西已经存在了。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-01 12:50:05

如果您使用的是特定的平台(Win32?)互斥实现-那么您应该查阅该平台的文档。

如果您使用的是C++11标准的mutex - std::mutex,则改用std::recursive_mutex。请注意,对于要锁定()的每个调用,您都需要调用unlock()。

票数 0
EN

Stack Overflow用户

发布于 2012-02-01 13:09:40

太长时间不能发表评论了,所以很抱歉,这是一个回答。

IMO,任何需要递归锁定的设计都有可能结束鼻守护进程。重新设计您的代码,以便同一锁不必被同一线程多次获取。海事组织的一个良好做法是,永远不要从其他公共职能(也锁定)中调用公共职能(应锁定),所有私人职能也不应锁定-即它们只能由公共方法(锁定)调用。

因此,重新组织代码,以便在同一个线程的上下文中调用的方法有一个进入对象的入口点,然后锁定,并且任何后续的私有函数调用都可以在此锁下操作。这种方法有一些缺点(例如,顺序函数调用的多个锁操作-但是如果通过分析证明这是一个瓶颈,那么采用一种模式,通过一个成员公开互斥对象,正如前面提到的一个人在函数调用期间使用RAII锁定该锁)。

总之,如果你能避免递归互斥.

票数 1
EN

Stack Overflow用户

发布于 2012-02-01 12:45:09

调查RAII。这样你就不用担心那个问题了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9096010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档