alternatives pthread_cancel () dans Android NDK?
-
25-09-2019 - |
Question
Je suis PORTAGE un corps de taille moyenne du code C ++ pour Android NDK. Malheureusement, la mise en œuvre pthreads (au 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 ne met pas en œuvre pthread_cancel ()! Il y a d'autres réponses évidentes lorsque le thread de travail est normalement répondre. Mais dans les cas où le thread de travail ne répond pas (par exemple boucle infinie), comment puis-je annuler sans tuer tout le processus?
La solution
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 une le signal SIG_USR1 et l'utilisation gestionnaire de signaux pour quitter ce pthread et essayé, il fonctionne, mais toujours demander le cas échéant 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
Autres conseils
J'ai fait une petite bibliothèque qui prennent soin de cela.
Il exploite certains bits non utilisés de la structure de fil bionique.
Je l'ai appelé libbthread :)
Profitez;)