【发布时间】:2014-11-12 01:33:24
【问题描述】:
我目前遇到了一些关于 C++ 并发编程的设计问题 我想知道你是否可以帮助我:
假设某个函数func 对某个对象obj 进行操作。在这些操作期间需要持有一个锁(可能是obj 的成员变量)。现在假设
func 在持有锁的同时调用子函数 func_2。现在func_2 对已锁定的对象进行操作。但是,如果我还想在不持有锁的情况下从其他地方调用func_2 怎么办? func_2 应该锁定 obj 还是不应该?我看到了 3 种可能性:
- 我可以将
bool传递给func_2,指示是否需要不锁定。 不过,这似乎引入了很多样板代码。 - 我可以使用递归锁并且总是将
obj锁定在func_2中。递归锁 好像 不过有问题,请参阅here。 - 我可以假设
func_2的每个调用者都已经持有锁。我会 记录这一点并可能强制执行这一点(至少在调试模式下)。是 让函数对哪些锁是/不是做假设是合理的 由调用线程持有?更一般地说,我如何从设计的角度做出决定 一个函数是否应该锁定Obj,哪个应该假设它已经被锁定? (显然,如果一个函数假定持有某些锁,那么它只能调用 至少做出同样强假设但除此之外的函数?)
我的问题如下:实践中使用了这些方法中的哪一种,为什么?
提前致谢
hfhc2
【问题讨论】:
标签: c++ multithreading locking mutex