In questo caso, no il mutex non verrà sbloccato quando questo codice non rientra nell'ambito.
I locker di mutex che seguono RAII utilizzano il fatto che un distruttore viene chiamato automaticamente quando un oggetto allocato non heap esce dall'ambito. Quindi sblocca il mutex una volta che l'oggetto che ha bloccato il mutex esce dall'ambito. Nel caso del codice, nessun oggetto viene allocato nell'ambito delle parentesi graffe, quindi non è possibile sbloccare il mutex una volta terminato l'ambito.
Ad esempio, utilizzando QMutexLocker
dalle librerie Qt, è possibile garantire che il vostro mutex è sbloccato quando la portata è finita:
{
QMutexLocker locker(myMutex);
if(checkSomething())
{
return;
}
doSomething();
}
Questo codice è simile a:
{
mutex_lock(myMutex);
if(checkSomething())
{
mutex_unlock(myMutex);
return;
}
doSomething();
mutex_unlock(myMutex);
}
Anche se, come Brian Neal sottolinea che non gestisce in modo sicuro il caso in cui checkSomething()
e doSomething()
generano eccezioni.
Un'alternativa a Qt's QMutexLocker
sarebbe STD std::lock_guard.
fonte
2013-07-18 16:51:42
Quale implementazione mutex stai usando? A meno che tu non stia implementando mutex con RAII, probabilmente dovrai sbloccare esplicitamente il mutex. – Void
Grazie a @Void. Sto usando pthread.h. Cioè pthread_mutex_unlock() e pthread_mutex_lock(). Cos'è RAII? –
@AmitNayar: vedere http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization.È probabilmente l'idioma più importante in C++, poiché è quasi impossibile gestire correttamente la memoria e altre risorse dinamiche senza di esso. –