锁定线程的问题直到函数返回?

时间:2016-09-23 17:21:54

标签: multithreading visual-c++ thread-safety

这是我正在进行的项目中发生的事情的一个非常基本的例子。该场景基本上是一个调用其他函数的函数,这些函数全部锁定当前线程的资源,直到完成为止。这是一个小例子。

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等等?或者这是锁定线程和处理函数中资源的典型方法吗?

1 个答案:

答案 0 :(得分:1)

3,4和更多嵌套级别没有其他问题。一般问题是当你从1级扩展到几级时。 std :: mutex不是递归的,这意味着你不能锁定它两次,即使你试图从已经锁定它的线程中做到这一点。所以lockUntilDone必须使用recursive_mutex。它们也是由STL提供的,你可以使用它们,但它们的效率低于非递归的。

但还有另一个考虑因素:当你必须从多个嵌套函数中锁定相同的对象时,情况并不典型。这可能没问题,但这是代码必须重构的症状。例如,锁可能太粗糙,可以分成几个锁。或者某些方法实际上是私有方法,它们总是从锁定的上下文中调用,不需要额外的锁定。

就个人而言,我只会在functionA中进行锁定。如果functionB不是私有的并且可以在functionA之外调用,那么我将使私有的函数B没有锁定,这将完成所有工作并从functionA和public functionB中使用它来执行锁定并调用内部函数。