マルチスレッド コードでは、スレッドがミューテックス ロックを取得した場合にデッドロックが発生する可能性がありますが、それを解放する前にスレッドがメイン スレッドによって一時停止されるか、スケジューラによって横取りされますか?
私は pthread ライブラリを使用する初心者なので、以下のクエリ/提案されたソリューションが実行不可能または完全に間違っている可能性がある場合は、ご容赦ください。
void main()
{
thread_create(T1,NULL,thr_function,NULL)
suspend_thread(T1);
acquire_lock(Lock1);<--- //Now here is a possible deadlock if thread_function acquried Lock1 before main and main suspended T1 before its release
//Do something further;
}
void *thr_function(void *val)
{
///do something;
acquire_lock(Lock1);
//do some more things;
//do some more things;
release_lock(Lock1);
}
上記の擬似コード セグメントでは、スレッド ランタイム/コンパイラが連携して、mutex ロックを取得したスレッドが中断/プリエンプションされているかどうかを確認してから、「クリーンアップ コード」を実行することはできません。抜け出す前に保持していたすべてのロックを解放します。コンパイラ/リンカーは、スレッド関数内でロックを取得、解放する場所を識別できます。次に、スレッドがこれらの 2 つの場所の間で (つまり、取得後、解放前に) 中断されると、スレッド関数での実行は、ある種の ' goto label;
'を介してジャンプする必要があります。ランタイムによって挿入され、label:
スレッドでロックが解放され、スレッドがブロックされるか、コンテキストの切り替えが発生します。[スレッドが複数のロックを取得した場合、それらのポイントを飛び越えてそれらのロックを解放するのが面倒になる可能性があることはわかっています...]
しかし、基本的なアイデア/質問は、スレッド関数が、ブロックアウトされる前、または実行状態から出て待機する前、またはその他の状態になる前に、ミューテックス、セマフォに対して取得したロックの必要な解放を行わないことはできますか?