我是新来的助推库,它是如此惊人的库!另外,我对互斥体很陌生,所以如果我犯了一个新手错误,请原谅我。提升互斥锁定在同一线程上
无论如何,我有两个函数叫做FunctionOne
和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();
}
如果f1和f2由同一个线程调用,那么如何F2可以称得上而F1仍在进行中?你的意思是从f1调用f2吗? –
这就是我所困惑的。我确信FunctionOne和FunctionTwo是从一个单独的线程调用的。但是,我做了以下操作:'printf(“Function:%s,time:%f”,__FUNCTION__,globals-> currentTime());'有时候这两个函数都会立即调用(并且应用程序崩溃以便写入相同的资源),并通过一个互斥体,应用程序在自己的线程上等待。 – arao6
-1这个问题需要一个SSCCE。见http://www.sscce.org/正如你在浪费你自己的时间,也是为了我们的。 **更新**嗯。为什么RSS提要中的旧问题? – sehe