这是我正在进行的项目中发生的事情的一个非常基本的例子。该场景基本上是一个调用其他函数的函数,这些函数全部锁定当前线程的资源,直到完成为止。这是一个小例子。
void functionA()
{
lockUntilDone();
//do some magic
functionB();
//do some more magic
}
void functionB()
{
lockUntilDone();
//make some more magic
functionC();
}
void functionC()
{
lockUntilDone();
//make a little bit more magic
}
lockUntilDone() - 锁定当前线程中的资源,直到函数完成执行并超出范围。
我刚刚开始学习使用线程和进程。 在运行functionA期间可能出现什么问题?如果这个场景得到扩展怎么办?所以不是三级锁定而是4,5,6等等?或者这是锁定线程和处理函数中资源的典型方法吗?
答案 0 :(得分:1)
3,4和更多嵌套级别没有其他问题。一般问题是当你从1级扩展到几级时。 std :: mutex不是递归的,这意味着你不能锁定它两次,即使你试图从已经锁定它的线程中做到这一点。所以lockUntilDone
必须使用recursive_mutex。它们也是由STL提供的,你可以使用它们,但它们的效率低于非递归的。
但还有另一个考虑因素:当你必须从多个嵌套函数中锁定相同的对象时,情况并不典型。这可能没问题,但这是代码必须重构的症状。例如,锁可能太粗糙,可以分成几个锁。或者某些方法实际上是私有方法,它们总是从锁定的上下文中调用,不需要额外的锁定。
就个人而言,我只会在functionA中进行锁定。如果functionB不是私有的并且可以在functionA之外调用,那么我将使私有的函数B没有锁定,这将完成所有工作并从functionA和public functionB中使用它来执行锁定并调用内部函数。