2011-01-05 18 views
19

Sto eseguendo il porting di un corpo di codice C++ di medie dimensioni 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 di lavoro. NDK non implementa pthread_cancel()! Esistono altre risposte ovvie quando il thread di lavoro risponde normalmente. Ma nei casi in cui il thread worker non risponde (ad esempio loop infinito), come posso cancellarlo senza uccidere l'intero processo?alternative pthread_cancel() in Android NDK?

risposta

14

Possibile opzione 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 far scattare un segnale SIG_USR1 e utilizzare gestore del segnale per uscire da questa pthread e l'ho provato , funziona, ma continua a chiedersi se esistono eventuali svantaggi per 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)); 
} 

USR1 gestore:

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

Sembra che la risposta migliore è quella di riscrivere in modo che le discussioni non sono in attesa sulla IO: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

+0

il thread lavoratore su un semaforo per gli eventi esterni quando si aspetta, quindi questo è il posto più ovvio per aggiungere un assegno per la cancellazione thread. C'è un limitato I/O di blocco, ma non è la causa prevista del fatto che il thread non risponda. Speravo di evitare l'uso di segnali per l'interruzione del thread, perché ciò richiede sigmaks di hacking in ogni thread, IME. –

+2

Sì, è un peccato che non sia nell'attuale NDK di Android, aggiunge alcune attività fastidiose. Le gioie dello sviluppo multipiattaforma. Abbiamo effettuato facilmente il porting della libreria di threading in quanto non è necessario utilizzare pthread_cancel o semafori, ma sembra che una sorta di implementazione di riscrittura/interfaccia debba cambiare a causa di quella mancante. –

+0

Chiamare 'pthread_exit()' in un gestore di segnale è fondamentalmente ciò che fa l'annullamento asincrono (si veda 'pthread_setcanceltype()'). Questo è pericoloso e difficile da usare correttamente. La cancellazione posticipata è più facile da utilizzare correttamente in quanto annulla solo a specifici punti di cancellazione (anche se è ancora uno sforzo considerevole), ma è anche più difficile da implementare per la libreria di threading. – jilles

0

I fatto una piccola biblioteca che si prende cura di questo.

Sfrutta alcuni bit inutilizzati della struttura del filo bionico.

ho chiamato libbthread :)

Godetevi;)