que iba a través de un código heredado y encontré el siguiente fragmento:¿Los destructores deben ser seguros para la fabricación de hilos?
MyClass::~MyClass()
{
EnterCriticalSection(&cs);
//Access Data Members, **NO Global** members are being accessed here
LeaveCriticalSection(&cs);
}
Me pregunto va a ayudar, por casualidad, para custodiar el destructor?
considere un escenario:
1. Thread1 - About to execute any of the member function which uses critical section
2. Thread2- About to execute destructor.
Si la orden de ejecución es 1 => 2, entonces podría funcionar. Pero, ¿y si el orden se invierte?
¿Es un problema de diseño?
¿Pero debería ser seguro para los hilos en sí mismo? ¿Existe la posibilidad de que una clase sea "destruida dos veces" en paralelo? –
@ TomášZato: No. Si una clase (con un destructor no trivial) se "destruye dos veces", no importa si esto sucede de manera segura o no, es UB en cualquier caso. – MikeMB
A pesar de la edad de la respuesta, no estoy de acuerdo. Se debe aplicar una sincronización si las variables miembro han sido modificadas por otro hilo que el hilo donde se llamará al dtor.Sin embargo, no necesita ser una "sección crítica". Lo que se requiere es que exista una relación "Sincronizaciones con" entre los dos hilos. Esto puede requerir barreras de memoria apropiadas en cualquier hilo, a menos que los hilos sean los mismos. – CouchDeveloper