在同一个线程上提升互斥锁定

时间:2012-12-10 17:39:34

标签: c++ boost lua mutex

我是升级库的新手,这是一个非常棒的库!此外,我是互斥的新手,所以如果我犯了新手的错误,请原谅我。

无论如何,我有两个名为FunctionOneFunctionTwo的函数。 FunctionOneFunctionTwo由不同的线程异步调用。所以这就是发生的事情:在FunctionOne中,我在函数的开头锁定一个全局互斥锁,并在函数结束时解锁全局互斥锁。 FunctionTwo也是如此。

现在问题出现了:有时,FunctionOneFunctionTwo被称为相隔不到几毫秒(但并非总是如此)。因此,FunctionOne开始执行,并在FunctionTwo执行中途。当FunctionTwo锁定互斥锁时,FunctionOneFunctionTwo所在的整个线程都会停止,因此FunctionOne被中途停留,并且线程在{ {1}}永远。所以,总结一下:

  • 功能1锁定互斥锁并开始执行代码。
  • 几毫秒后调用函数2并锁定互斥锁,冻结线程函数1和2。
  • 现在func 1被卡住一半并且线程被冻结,因此func 1永远不会完成并且互斥锁永远被锁定,等待func 1完成。

在这种情况下,人们做了什么?这是我的代码:

FunctionTwo

2 个答案:

答案 0 :(得分:8)

这些函数是否可以重入,这样FunctionOne会在持有互斥锁的同时调用自身或FunctionTwo?反之亦然,FunctionTwo锁定互斥锁,然后在互斥锁被锁定时调用FunctionOne / FunctionTwo?

  • 如果没有,那么你不应该从同一个线程调用这两个函数。如果你打算阻止FunctionTwo直到FunctionOne完成,那么在同一个线程上调用它是错误的。如果lua_performcalc最终调用FunctionTwo,就会发生这种情况。这是他们可以在同一个线程上调用的唯一方式。

  • 如果是这样,那么您需要一个recursive_mutex。常规互斥锁只能锁定一次;从同一个线程再次锁定它是一个错误。递归互斥锁可以被单个线程多次锁定并被锁定,直到线程调用解锁相同的次数。

在任何一种情况下,都应该避免显式调用lock和unlock。如果抛出异常,则互斥锁将无法解锁。最好使用RAII风格的锁定,如下所示:

{
    boost::recursive_mutex::scoped_lock lock(mutex);

    ...critical section code...

    // mutex is unlocked when 'lock' goes out of scope
}

答案 1 :(得分:3)

您的描述不正确。互斥锁无法锁定两次。你有一个不同的问题。

  • 在互斥锁被锁定时检查重入。
  • 检查例外情况

为了避免例外问题,您应该使用boost::mutex::scoped_lockRAAI