2011-01-05 15 views
19

Estoy portando un cuerpo mediano de código C++ a Android NDK. Lamentablemente, la implementación de pthreads (a partir de NDK v5, de todos modos) está incompleta. Específicamente, nuestra aplicación se basa en pthread_cancel() para eliminar un hilo de trabajo. NDK no implementa pthread_cancel()! Hay otras respuestas obvias cuando el hilo de trabajo responde normalmente. Pero en los casos en que el subproceso de trabajo no responde (por ejemplo, ciclo infinito), ¿cómo puedo cancelarlo sin matar todo el proceso?pthread_cancel() alternativas en Android NDK?

Respuesta

14

Opción posible que funcione para este tipo: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

Traspaso de aquí en caso de:

Luego uso pthread_kill para desencadenar una señal SIG_USR1 y utilizar el manejador de señales para salir de esta pthread y probé , funciona, pero todavía se pregunta si hay algún inconveniente para este tipo de método.

temporizador Salida:

if ((status = pthread_kill(pthread_id, SIGUSR1)) != 0) 
{ 
    printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status)); 
} 

USR1 manejador:

struct sigaction actions; 
memset(&actions, 0, sizeof(actions)); 
sigemptyset(&actions.sa_mask); 
actions.sa_flags = 0; 
actions.sa_handler = thread_exit_handler; 
rc = sigaction(SIGUSR1,&actions,NULL); 
void thread_exit_handler(int sig) 
{ 
    printf("this signal is %d \n", sig); 
    pthread_exit(0); 
} 

Parece que la mejor respuesta es volver a escribir de manera que los hilos no están a la espera de IO: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

+0

Los trabajadores hilo espera en un semáforo para los eventos externos cuando se espera, por lo que es el lugar obvio para agregar un cheque para la cancelación hilo. Hay algunas E/S de bloqueo limitadas, pero esa no es la causa esperada de que el hilo deje de responder. Esperaba evitar el uso de señales para el cierre del hilo porque eso requiere hackear sigmasks en cada hilo, IME. –

+2

Sí, es una pena que no esté en el actual NDK de Android, agrega algunas tareas molestas. Las alegrías del desarrollo multiplataforma. Transmitimos con bastante facilidad nuestra biblioteca de subprocesos ya que no tenemos que usar pthread_cancel o semáforos, pero parece que algún tipo de reescritura/implementación de interfaz tendrá que cambiar debido a que falta. –

+0

Llamar 'pthread_exit()' en un manejador de señal es básicamente lo que hace la cancelación asincrónica (vea 'pthread_setcanceltype()'). Esto es peligroso y difícil de usar correctamente. La cancelación diferida es más fácil de usar correctamente ya que solo cancela en puntos de cancelación específicos (aunque todavía es un esfuerzo considerable), pero también es más difícil de implementar para la biblioteca de subprocesos. – jilles

0

I hizo una pequeña biblioteca que se ocupa de esto.

Aprovecha algunos bits no utilizados de la estructura del hilo biónico.

me llamaron libbthread :)

Enjoy;)