この場合、このコードが範囲外になるとミューテックスはロック解除されません。
RAII に従うミューテックス ロッカーは、ヒープに割り当てられていないオブジェクトがスコープ外になると、デストラクタが自動的に呼び出されるという事実を利用します。次に、ミューテックスをロックしたオブジェクトが範囲外になると、ミューテックスのロックを解除します。コードの場合、中かっこのスコープ内にオブジェクトが割り当てられていないため、スコープが終了するとミューテックスがロック解除される可能性はありません。
たとえばQMutexLocker
、Qt ライブラリから使用すると、スコープが終了したときにミューテックスのロックが解除されていることを確認できます。
{
QMutexLocker locker(myMutex);
if(checkSomething())
{
return;
}
doSomething();
}
このコードは次のようになります。
{
mutex_lock(myMutex);
if(checkSomething())
{
mutex_unlock(myMutex);
return;
}
doSomething();
mutex_unlock(myMutex);
}
Brian Neal が指摘しているように、例外checkSomething()
をdoSomething()
スローするケースを安全に処理することはできません。
Qt の代替QMutexLocker
は、STD のstd::lock_guardです。