我是 boost 库的新手,这是一个非常棒的库!另外,我是互斥锁的新手,如果我犯了新手错误,请原谅我。
无论如何,我有两个函数叫做FunctionOne
and FunctionTwo
。FunctionOne
并由FunctionTwo
不同的线程异步调用。所以这就是发生的事情:在FunctionOne
中,我在函数的开头锁定了一个全局互斥锁,并在函数的末尾解锁了全局互斥锁。同样的事情FunctionTwo
。
现在问题来了:有时,FunctionOne
并且FunctionTwo
相隔不到几毫秒的时间被调用(但并非总是如此)。因此,FunctionOne
开始执行并执行到一半FunctionTwo
。当锁定互斥锁时,FunctionTwo
整个线程都停止了,所以中途卡住了,线程永远等待自己。所以,总结一下:FunctionOne
FunctionTwo
FunctionOne
FunctionTwo
- 函数 1 锁定互斥体并开始执行代码。
- 函数 2 在几毫秒后被调用并锁定互斥锁,冻结线程 func 1 和 2 正在运行。
- 现在 func 1 卡在中途并且线程被冻结,所以 func 1 永远不会完成并且互斥锁被永远锁定,等待 func 1 完成。
在这种情况下怎么办?这是我的代码:
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();
}