我目前遇到了一些关于C++并发编程的设计问题,希望你能帮助我:
假设某个函数 func
操作某个对象 obj
。在这些操作期间需要持有一个锁(可能是 obj
的成员变量)。现在假设 func
在持有锁时调用子函数 func_2
,而 func_2
又对已经被锁定的对象进行操作。然而,如果我还想从其他地方调用 func_2
而不持有锁怎么办?func_2
应该锁定 obj
吗?还是不应该锁定?我看到有三种可能性:
- 我可以向
func_2
传递一个布尔值,指示是否需要锁定。但这似乎会引入很多样板代码。 - 我可以使用递归锁,并在
func_2
中始终锁定obj
。但递归锁似乎存在问题,详情见此处。 - 我可以假设每个调用
func_2
的函数都已经持有锁。我需要记录这一点,并可能在调试模式下强制执行此操作。从设计角度来看,函数是否应该锁定Obj
,哪些函数应该假设它已经被锁定?(显然,如果一个函数假设某些锁已经被持有,则它只能调用那些至少具有同等强度假设的函数,除此之外呢?)
我的问题是:实践中使用这些方法中的哪一个,以及为什么?
提前感谢
hfhc2