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
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
I fatto una piccola biblioteca che si prende cura di questo.
Sfrutta alcuni bit inutilizzati della struttura del filo bionico.
ho chiamato libbthread :)
Godetevi;)
- 1. supporto unicode in Android ndk
- 2. Integrazione NDK in studio Android
- 3. Uso di NDK Android
- 4. Android NDK #define Problemi
- 5. edificio Android NDK-?
- 6. Sviluppo incrementale NDK Android
- 7. Android NDK pretty printing
- 8. Problemi NDK assert.h Android
- 9. Sviluppo NDK Android
- 10. Timer NDK Android
- 11. Moduli nidificati Android ndk
- 12. Supporto NDK deprecato per Android Studio 1.1.0
- 13. Alternative per String.join in Android?
- 14. Sostituzione per `__system_property_get` in Android L NDK
- 15. link libreria condivisa in Android NDK
- 16. JNIEXPORT e JNICALL in Android NDK
- 17. Reindirizzamento stdout a logcat in Android NDK
- 18. biblioteca Usare C in Android NDK sopra
- 19. NDK Integrazione in Android Studio Errore
- 20. Supporto 'wstring' Android NDK C++
- 21. Test dell'unità su Android NDK
- 22. Qualche esperienza con Android NDK?
- 23. ANDROID NDK - android: comando non trovato
- 24. Android NDK e FFMPEG build
- 25. Edificio OpenSSL su Android NDK
- 26. Old Versions of Android NDK
- 27. Android NDK vantaggi e svantaggi
- 28. funzione __android_log_print NDK Android andLogCat
- 29. android-ndk, glGenVertexArrayOES non trovato
- 30. Alternative all'emulatore di android avd
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. –
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. –
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