2011-01-05 3 views
19

Je porte un corps de taille moyenne de code C++ à Android NDK. Malheureusement, l'implémentation de pthreads (à partir de NDK v5, de toute façon) est incomplète. Plus précisément, notre application repose sur pthread_cancel() pour tuer un thread de travail. NDK n'implémente pas pthread_cancel()! Il existe d'autres réponses évidentes lorsque le thread de travail répond normalement. Mais dans les cas où le thread de travail ne répond pas (par exemple boucle infinie), comment puis-je l'annuler sans tuer le processus entier?Alternatives pthread_cancel() dans Android NDK?

Répondre

14

Option possible qui fonctionne pour ce type: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

Republier ici au cas où:

Puis-je utiliser pthread_kill pour déclencher un signal SIG_USR1 et utiliser le gestionnaire de signaux pour quitter cette pthread et essayé , il fonctionne, mais je me demande toujours si des inconvénients pour ce genre de méthode.

minuterie sur:

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

gestionnaire USR1:

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); 
} 

On dirait que la meilleure réponse est de réécrire afin que les fils ne sont pas en attente sur IO: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

+0

le thread de travail sur un sémaphores pour les événements externes quand il attend, si c'est l'endroit évident pour ajouter un chèque pour l'annulation de thread. Il y a quelques E/S de blocage limitées mais ce n'est pas la cause attendue du thread qui ne répond plus. J'espérais éviter d'utiliser des signaux pour l'arrêt du thread, car cela nécessite de pirater les sigmasks dans chaque thread, IME. –

+2

Oui, c'est une honte qui n'est pas dans le NDK Android actuel, ajoute des tâches ennuyeuses. Les joies du développement multi-plateforme. Nous avons porté notre librairie de threads assez facilement car nous n'avons pas besoin d'utiliser pthread_cancel ou des sémaphores, mais il semblerait que l'implémentation de réécriture/interface doive changer à cause de ce qui manque. –

+0

L'appel de 'pthread_exit()' dans un gestionnaire de signal est essentiellement ce que fait l'annulation asynchrone (voir 'pthread_setcanceltype()'). C'est dangereux et difficile à utiliser correctement. L'annulation différée est plus facile à utiliser car elle ne s'annule qu'à des points d'annulation spécifiques (bien que l'effort soit encore considérable), mais il est également plus difficile à implémenter pour la librairie de threads. – jilles

0

I fait une petite bibliothèque qui s'occupe de ça.

Il exploite certains bits inutilisés de la structure de fil bionique.

Je l'ai appelé libbthread :)

jouissions)