【发布时间】:2012-11-28 04:11:45
【问题描述】:
我是 boost 库的新手,它真是一个了不起的库!另外,我是互斥锁的新手,如果我犯了新手错误,请原谅我。
不管怎样,我有两个函数叫做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 被同一个线程调用,那么在 f1 仍在进行中时如何调用 f2?你的意思是从 f1 调用 f2 吗?
-
这就是我感到困惑的地方。我确定 FunctionOne 和 FunctionTwo 是从单独的线程调用的。但是,我做了以下事情:
printf("Function: %s, time: %f", __FUNCTION__, globals->currentTime());有时会同时调用这两个函数(并且应用程序因写入同一资源而崩溃),并且使用互斥锁,应用程序会在自己的线程上等待。 -
-1 该问题需要 SSCCE。请参阅sscce.org 就像您在浪费自己的时间一样,也是在浪费我们的时间。 更新嗯。为什么 RSS 提要中有旧问题?
-
我很好奇,你有没有深入了解这个问题?看来您对问题的描述首先违反了“互斥体”的原则......