PTHREAD_CANCEL () alternativas no Android NDK?
-
25-09-2019 - |
Pergunta
Estou portando um corpo de tamanho médio de código C ++ para o Android NDK. Infelizmente, a implementação do Pthreads (em NDK V5, de qualquer maneira) está incompleta. Especificamente, nosso aplicativo depende do pthread_Cancel () para matar um tópico de trabalhador. O NDK não implementa pthread_cancel ()! Existem outras respostas óbvias quando o tópico do trabalhador está respondendo normalmente. Mas nos casos em que o fio do trabalhador não está respondendo (por exemplo, loop infinito), como posso cancelá -lo sem matar todo o processo?
Solução
Opção possível que funcione para esse cara: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html
Repositando aqui no caso:
Em seguida, uso Pthread_kill para acionar um sinal SIG_USR1 e usar o manipulador de sinal para sair deste pTHread e experimentar, ele funciona, mas ainda me pergunto se alguma desvantagem para esse tipo de método.
Timer fora:
if ( (status = pthread_kill(pthread_id, SIGUSR1)) != 0)
{
printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status));
}
Manipulador de 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);
}
Parece que a melhor resposta é reescrever para que os tópicos não estejam esperando em IO: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1
Outras dicas
Fiz uma pequena biblioteca que cuida disso.
Ele explora alguns bits não utilizados da estrutura de roscas biônicas.
Eu chamei libbthread :)
Apreciar ;)