ara*_*ao6 4 c++ lua boost mutex
我是升级库的新手,它是如此惊人的库!此外,我是互斥的新手,所以请原谅我,如果我犯了新手的错误.
无论如何,我有两个函数叫FunctionOne和FunctionTwo.FunctionOne并且FunctionTwo由不同的线程异步调用.所以这就是发生的事情:在FunctionOne,我在函数的开头锁定一个全局互斥锁,并在函数结束时解锁全局互斥锁.同样的事情FunctionTwo.
现在问题在于:有时,FunctionOne并且FunctionTwo被称为相隔不到几毫秒(但并非总是如此).因此,FunctionOne开始执行并FunctionTwo执行中途.当FunctionTwo 锁定互斥体,整个线程FunctionOne和FunctionTwo上停止,所以FunctionOne被套牢中途通过,并在自己的线程等待FunctionTwo,直到永远.所以,总结一下:
在这种情况下做什么?这是我的代码:
boost::mutex g_Mutex;
lua_State* L;
// Function 1 is called from some other thread
void FunctionOne()
{
g_Mutex.lock();
lua_performcalc(L);
g_Mutex.unlock();
}
// Function 2 is called from some other thread a few ms later, freezing the thread
// and Function 1 never finishes
void FunctionTwo()
{
g_Mutex.lock();
lua_performothercalc(L);
g_Mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)
这些函数是否可以重入,这样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
}
Run Code Online (Sandbox Code Playgroud)