通过组合向类添加锁

时间:2010-08-16 17:17:37

标签: c++ multithreading locks

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

2 个答案:

答案 0 :(得分:1)

看起来你重新发明了Bridge Pattern。听起来很完美。

答案 1 :(得分:1)

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

Recursive Lock (Mutex) vs Non-Recursive Lock (Mutex)

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

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

所以也许你在自己​​陷入困境时做了别的错事?不得不解决自己在同一个线程中使用奇怪的函数调用语义从同一个互斥锁上死锁的问题,这不是你应该做的事情。