首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按组合向类添加锁

按组合向类添加锁
EN

Stack Overflow用户
提问于 2010-08-16 17:17:36
回答 2查看 397关注 0票数 1

我正在用C++编写线程安全类。它的所有公共方法都使用锁(非递归自旋锁)。私有方法是无锁的。因此,一切都应该是正常的:用户调用公共方法,它锁定对象,然后通过私有方法完成工作。但是当一个公共方法调用另一个公共方法时,我被锁死了。我读过递归互斥是不好的,因为很难调试它们。所以我使用C的stdio方式: public方法Foo()只锁定对象并调用Foo_nolock()来完成整个工作。但我不喜欢这些_nolock()方法。我觉得它重复了我的代码。因此,我有一个想法:我将制作无锁类BarNoLock,以及只有一个成员的线程安全类栏: BarNoLock的一个实例。所有Bar的方法只会锁定这个成员并调用它的方法。这是一个好主意,还是有一些更好的模式/实践?谢谢。更新:我知道pimpl和桥的情况。我问的是多线程模式,而不是OOP。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-16 17:27:53

我不知道为什么递归互斥会被认为是不好的,请参阅这个问题来讨论它们。

递归锁(互斥锁)与非递归锁(互斥锁)

但我认为这不一定是您的问题,因为Win32关键部分支持来自同一个线程的多个条目而不阻塞。来自文档

当线程拥有一个关键部分时,它可以对EnterCriticalSection或TryEnterCriticalSection进行额外的调用,而无需阻止其执行。这可以防止线程在等待它已经拥有的关键部分时自身死锁。要释放其所有权,线程必须每次进入关键部分时都调用LeaveCriticalSection一次。对于等待线程获得关键部分所有权的顺序没有保证。

所以也许你在死锁自己的时候做了别的错事?必须工作,而不是用奇怪的函数调用语义将自己锁在同一个线程的同一个互斥对象上,这是你不应该做的事情。

票数 1
EN

Stack Overflow用户

发布于 2010-08-16 17:23:01

看来你已经重新发明了桥型。听起来很井井有条。

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

https://stackoverflow.com/questions/3495548

复制
相关文章

相似问题

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