我是升级库的新手,这是一个非常棒的库!此外,我是互斥的新手,所以如果我犯了新手的错误,请原谅我。
无论如何,我有两个名为FunctionOne
和FunctionTwo
的函数。 FunctionOne
和FunctionTwo
由不同的线程异步调用。所以这就是发生的事情:在FunctionOne
中,我在函数的开头锁定一个全局互斥锁,并在函数结束时解锁全局互斥锁。 FunctionTwo
也是如此。
现在问题出现了:有时,FunctionOne
和FunctionTwo
被称为相隔不到几毫秒(但并非总是如此)。因此,FunctionOne
开始执行,并在FunctionTwo
执行中途。当FunctionTwo
锁定互斥锁时,FunctionOne
和FunctionTwo
所在的整个线程都会停止,因此FunctionOne
被中途停留,并且线程在{ {1}}永远。所以,总结一下:
在这种情况下,人们做了什么?这是我的代码:
FunctionTwo
答案 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)