2010-01-29 8 views
11

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?

+1

siempre se puede probar ..: P – sud03r

+2

pruebas @Neeraj no siempre cuentan toda la verdad. – AraK

+1

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

Respuesta

15

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.

1

Lo dudo - pthread es una C api pura, así que dudo que tenga algún mecanismo para desenrollar la pila del hilo.

0

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.

0

#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 
+0

interrumpiste el sueño, no lo mató – Will

Cuestiones relacionadas