私はブースト ライブラリを初めて使用しましたが、これは素晴らしいライブラリです。また、私はミューテックスを初めて使用するので、初心者の間違いを犯している場合はご容赦ください。
とにかく、 と という 2 つの関数がFunctionOne
ありFunctionTwo
ます。別のスレッドによって非同期的に呼び出されますFunctionOne
。FunctionTwo
ではFunctionOne
、関数の最初でグローバル ミューテックスをロックし、関数の最後でグローバル ミューテックスをロック解除します。についても同じですFunctionTwo
。
ここに問題があります:FunctionOne
とFunctionTwo
が数ミリ秒以内に呼び出されることがあります (常にではありません)。したがって、FunctionOne
実行を開始し、途中でFunctionTwo
実行します。がミューテックスをロックすると、 とがオンになっているFunctionTwo
スレッド全体が停止するため、途中でスタックし、スレッドは永久に待機します。要約すると、次のようになります。FunctionOne
FunctionTwo
FunctionOne
FunctionTwo
- 関数 1 はミューテックスをロックし、コードの実行を開始します。
- 関数 2 は数ミリ秒後に呼び出されてミューテックスをロックし、関数 1 と 2 がオンになっているスレッドをフリーズします。
- func 1 が途中でスタックし、スレッドがフリーズしたため、func 1 は決して終了せず、mutex は永久にロックされ、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();
}