Estoy escribiendo un programa C++ de subprocesos múltiples. Planeo matar hilos. Sin embargo, también estoy usando un GC ref-contado. Me pregunto si los objetos asignados apilados se destruyen cuando se corta un hilo.Cuando elimino un pThread en C++, ¿se llaman los destructores de objetos en las pilas?
Respuesta
La pila no se desenrolla cuando 'mata' un hilo.
Killing Threads no es una forma robusta de operar: los recursos que tienen abiertos, como archivos, permanecen abiertos hasta que se cierra el proceso. Además, si mantienen abiertas las cerraduras en el momento en que las cierras, es probable que la cerradura permanezca bloqueada. Recuerde, es probable que llame a un montón de código de plataforma que no controla y no siempre puede ver estas cosas.
La manera elegante y robusta de cerrar un hilo es interrumpirlo; normalmente sondeará para ver si se le ha dicho que se cierre periódicamente o si está ejecutando un bucle de mensaje y le enviará un mensaje de abandono.
Lo dudo - pthread es una C api pura, así que dudo que tenga algún mecanismo para desenrollar la pila del hilo.
No está estandarizado para hacer esto. Parece que algunas implementaciones funcionan y otras no.
pthread_cancel() realmente debería evitarse, si puede; en realidad, no detiene el hilo hasta que llega a un punto de cancelación, que suele ser cualquier otra llamada pthread_ *. En particular, en muchas plataformas, una cancelación no interrumpirá una lectura de bloqueo.
#include<iostream>
#include<pthread.h>
class obj
{
public:
obj(){printf("constructor called\n");}
~obj(){printf("destructor called\n");}
};
void *runner(void *param)
{
printf("In the thread\n");
obj ob;
puts("sleep..");
sleep(4);
puts("woke up");
pthread_exit(0);
}
int main(int argc,char *argv[])
{
int i,n;
puts("testing pkill");
pthread_attr_t attr;
pthread_t tid;
//create child thread with default attributes
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,0);
pthread_cancel(tid);
pthread_join(tid,NULL);//wait till finished
//the parent process outputs value
return 0;
}
Aunque no coincide con los puntos de vista anteriores, las siguientes salidas de código
testing pkill In the thread constructor called sleep.. destructor called
interrumpiste el sueño, no lo mató – Will
- 1. ¿Se llaman los destructores después de un lanzamiento en C++?
- 2. ¿Cuál es el orden en que se llaman los destructores y los constructores en C++
- 3. Pilas de conmutación en C++
- 4. ¿Por qué se requieren destructores en C++?
- 5. ¿Por qué las funciones virtuales en C++ se llaman 'virtuales'?
- 6. C++ Demasiados destructores llamados tan pocos objetos
- 7. Comportamiento extraño de los destructores de C++
- 8. Usando pthread en C++
- 9. Destructores en C++
- 10. ¿Cómo se llaman objetos Scala de Java?
- 11. ¿Se heredan los destructores virtuales?
- 12. En .NET, ¿se llaman constructores estáticos cuando se crea un nuevo dominio de aplicación?
- 13. Cómo se llaman funciones de objetos padre en objetos secundarios en javascript
- 14. Destructores y herencia en C++?
- 15. ¿Los controladores de eventos en JavaScript se llaman en orden?
- 16. Pthread: ¿Por qué las personas se molestan en utilizar pthread_exit?
- 17. C# - ¿Los objetos se destruyen inmediatamente cuando salen del alcance?
- 18. ¿Cómo se llaman dinámicamente las rutas de ayuda en los rieles?
- 19. Cómo dormir o pausar un PThread en c en Linux
- 20. ¿Cómo se implementan los bloqueos de lectura/escritura en pthread?
- 21. ¿Por qué los destructores en la cadena de herencia de esa instancia se llaman, en orden, de la mayoría derivada a la derivada mínima?
- 22. Salir de un bloque: ¿se llama a los destructores?
- 23. ¿Por qué las cadenas se llaman "cadenas"?
- 24. py.test: prueba de detección fallida cuando las pruebas en directorios diferentes se llaman igual
- 25. ¿Cómo elimino/cuento objetos en un cubo s3?
- 26. ¿En qué orden se llaman los métodos de enlace UITableView?
- 27. Necesito separar eventos en jQuery cuando elimino los elementos
- 28. Encontrar inicializadores estáticos y destructores en C++
- 29. ¿Deberían los objetos eliminarse en C++?
- 30. Destructores virtuales para las interfaces
siempre se puede probar ..: P – sud03r
pruebas @Neeraj no siempre cuentan toda la verdad. – AraK
De hecho. Las pruebas mienten con frecuencia, en realidad. Recuerde que lo que funciona en un compilador/plataforma/máquina puede no funcionar en otro. Al mismo tiempo, recuerde que los estándares no siempre se siguen, por lo que la respuesta correcta a cualquier pregunta como esta es: Investigación Y Prueba. – Toji