Creo que tengo un buen manejo de al menos los conceptos básicos de multi-threading en C++, pero nunca he podido obtener una respuesta clara al bloquear un mutex alrededor de los recursos compartidos en el constructor o el destructor. Tenía la impresión de que deberías bloquear ambos lugares, pero recientemente los compañeros de trabajo no estuvieron de acuerdo. Fingir la siguiente clase se accede por varios subprocesos:Bloqueo de recursos compartidos en constructor y destructor
class TestClass
{
public:
TestClass(const float input) :
mMutex(),
mValueOne(1),
mValueTwo("Text")
{
//**Does the mutex need to be locked here?
mValueTwo.Set(input);
mValueOne = mValueTwo.Get();
}
~TestClass()
{
//Lock Here?
}
int GetValueOne() const
{
Lock(mMutex);
return mValueOne;
}
void SetValueOne(const int value)
{
Lock(mMutex);
mValueOne = value;
}
CustomType GetValueTwo() const
{
Lock(mMutex);
return mValueOne;
}
void SetValueTwo(const CustomType type)
{
Lock(mMutex);
mValueTwo = type;
}
private:
Mutex mMutex;
int mValueOne;
CustomType mValueTwo;
};
Por supuesto que todo debe ser seguro a través de la lista de inicialización, pero qué pasa con las cuentas al interior del constructor? En el destructor, ¿sería beneficioso hacer un bloqueo sin alcance y nunca desbloquear (básicamente, solo llamar a pthread_mutex_destroy)?
Al decir que la 'clase' es utilizado entre múltiples hilos, supongo que quiere decir que un objeto de tipo TestClass puede ser utilizado en múltiples hilos. En ese caso, solo está creando un solo objeto, por lo que no debería necesitar el bloqueo en el constructor. Si ambos hilos están en el constructor al mismo tiempo, están haciendo 2 objetos separados. Tiene más sentido bloquear la construcción de objetos, para asegurarse de que (por ejemplo) mValueTwo no se utiliza antes de que el objeto haya terminado de construir. Destructor parece que debería bloquearse, para asegurarse de que no se acceda a los datos mientras se destruyen. – Rollie
@Rollie Sí, quise decir que el objeto sería compartido. Entonces, si creo: – Brett
@Rollie: el acceso a la clase mientras se está destruyendo es un error con la gestión de instancias de por vida: el programa ya está roto cuando esto sucede (si se puede acceder mientras se está destruyendo, también podría ocurrir después)) –