我是新來的助推庫,它是如此驚人的庫!另外,我對互斥體很陌生,所以如果我犯了一個新手錯誤,請原諒我。提升互斥鎖定在同一線程上
無論如何,我有兩個函數叫做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