pThread_cancel () alternative in Android NDK?
-
25-09-2019 - |
Domanda
Sto portando un corpo di medie dimensioni di codice C ++ su Android NDK. Sfortunatamente l'implementazione di PThreads (a partire da NDK V5, comunque) è incompleta. In particolare, la nostra applicazione si basa su pThread_cancel () per uccidere un thread del lavoratore. NDK non implementa pThread_cancel ()! Ci sono altre risposte ovvie quando il thread del lavoratore risponde normalmente. Ma nei casi in cui il thread del lavoratore non risponde (ad es. Infinite Loop), come posso annullarlo senza uccidere l'intero processo?
Soluzione
Opzione possibile che funziona per questo ragazzo: http: //igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html
rinnovo di qui nel caso in cui:
Poi uso pthread_kill per innescare un SIG_USR1 del segnale e gestore di segnale uso per uscire pthread e provato, esso funziona, ma ancora chiedendo se del caso svantaggi di questo tipo di metodo.
Timer out:
if ( (status = pthread_kill(pthread_id, SIGUSR1)) != 0)
{
printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status));
}
handler 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);
}
appare come la risposta migliore è quella di riscrivere in modo che le discussioni non sono in attesa di Io: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1
Altri suggerimenti
Ho fatto una piccola biblioteca che si occupano di questo.
Sfrutta alcuni bit non utilizzati della struttura filettata bionico.
L'ho chiamato libbthread :)
Godere;)