2009-11-17 14 views
6

I due esempi di codice sono equivalenti?mutex e blocchi

Poco::ProcessHandle::PID ProcessRunner::processId() const 
{ 
    Poco::ProcessHandle::PID pid = 0; 
    mMutex.lock(); 
    pid = mPID; 
    mMutex.unlock(); 
    return pid; 
} 

,

Poco::ProcessHandle::PID ProcessRunner::processId() const 
{ 
    Poco::ScopedLock<Poco::Mutex> lock(mMutex); 
    return mPID; 
} 
  • Nel secondo campione: sarà la serratura andare fuori portata al termine della copia valore di ritorno è stato fatto? Ciò sarebbe importante se fosse restituito un oggetto con molte istruzioni per la copia.
  • È necessario un blocco se si restituisce solo un valore int? O è la copia dell'int un'operazione atomica?

risposta

8

Sono equivalenti. I locali non escono dall'ambito finché non è stata eseguita l'ultima riga del loro blocco. Quindi in questo caso, la copia del valore di ritorno viene eseguita sotto la protezione della serratura.

3

Se Poco's ScopedLock funziona come Lock_guard di Boost e l'assegnazione PID non può generare un'eccezione, la risposta alla prima domanda è sì. Lo scopo di questo ScopedLock è prevenire i deadlock. Non puoi dimenticare di sbloccare il mutex anche in caso di eccezioni generate. Hai bisogno di essere bloccato anche se "leggi solo alcuni dati"? Bene, in questo caso (accedere a una sola int) è una specie di zona grigia (meglio non farlo) ma in generale si blocca anche il mutex se si leggono solo i dati.

+0

Sono più preoccupato per l'atomicità delle operazioni. Che succede prima nel codice di esempio 2: la copia del valore di ritorno o la distruzione della serratura? Se questo non è il primo, allora è un codice bacato. – StackedCrooked

+0

Per quanto ne so, prima il valore restituito è "costruito", quindi tutti gli oggetti automatici vengono distrutti. – sellibitze

+0

Ho appena realizzato che se una funzione restituisce una variabile locale, deve copiarla prima di distruggerla. Doh. – StackedCrooked