gpt4 book ai didi

c++ - 通过组合向类添加锁

转载 作者:行者123 更新时间:2023-11-30 04:37:58 25 4
gpt4 key购买 nike

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

最佳答案

我不确定为什么递归互斥锁会被认为是不好的,请参阅此问题以讨论它们。

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

但我认为这不一定是您的问题,因为 Win32 临界区支持来自同一线程的多个条目而不会阻塞。来自doc :

When a thread owns a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns. To release its ownership, the thread must call LeaveCriticalSection one time for each time that it entered the critical section. There is no guarantee about the order in which waiting threads will acquire ownership of the critical section

所以当你陷入僵局时,也许你做错了什么?必须避免在同一线程中使用奇怪的函数调用语义将自己死锁在同一互斥锁上,这不是您应该做的事情。

关于c++ - 通过组合向类添加锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3495548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com