2009-11-17 18 views
6

¿Son equivalentes los dos ejemplos de código a continuación?mutexes y bloqueos

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; 
} 
  • En el segundo ejemplo: el bloqueo se vaya fuera de alcance después de realizar la copia valor de retorno? Esto sería importante si se devolvió un objeto que tenía muchas instrucciones para copiar.
  • ¿Es necesario un bloqueo si solo va a devolver un valor int? ¿O es la copia de la int una operación atómica?

Respuesta

8

Son equivalentes. Los locales no se salgan de alcance hasta después de que se haya ejecutado la última línea de su bloque. Entonces, en este caso, la copia del valor de retorno se realiza bajo la protección de la cerradura.

3

Si Poco's ScopedLock funciona de forma similar a Boost's lock_guard y la asignación PID no puede lanzar una excepción, la respuesta a la primera pregunta es sí. El objetivo de este ScopedLock es evitar interbloqueos. No puede olvidarse de desbloquear el mutex incluso en caso de que se emitan excepciones. ¿Necesita bloqueo incluso si "solo leyó algunos datos"? Bueno, en este caso (acceder solo a un int) es una especie de zona gris (mejor no lo hagas) pero en general también bloqueas el mutex si solo lees datos.

+0

Me preocupa más la atomicidad de las operaciones. ¿Qué sucede primero en el ejemplo de código 2: la copia del valor de retorno o la destrucción del bloqueo? Si este no es el primero, entonces es un código con errores. – StackedCrooked

+0

Por lo que puedo decir, primero se "construye" el valor de retorno, luego se destruyen todos los objetos automáticos. – sellibitze

+0

Me acabo de dar cuenta de que si una función devuelve una variable local, tiene que copiarla antes de destruirla. Doh. – StackedCrooked

Cuestiones relacionadas