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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top