2011-01-05 4 views
19

Ich portiere einen mittelgroßen C++ Code auf Android NDK. Leider ist die pthreads-Implementierung (zumindest ab NDK v5) unvollständig. Insbesondere verwendet unsere Anwendung pthread_cancel(), um einen Worker-Thread zu beenden. NDK implementiert pthread_cancel() nicht! Es gibt andere offensichtliche Antworten, wenn der Arbeitsthread normal reagiert. Aber in Fällen, in denen der Worker-Thread nicht antwortet (z. B. Endlosschleife), wie kann ich ihn abbrechen, ohne den gesamten Prozess zu beenden?pthread_cancel() Alternativen in Android NDK?

Antwort

14

Mögliche Option, die für diesen Typ funktioniert: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

hier bei Umbuchen:

Dann benutze ich pthread_kill ein SIG_USR1 Signal auszulösen und Signal-Handler verwenden diese Pthread zu verlassen und versucht, es Es funktioniert , aber immer noch Fragen, ob Nachteile für diese Art von Methode.

Timer aus:

if ((status = pthread_kill(pthread_id, SIGUSR1)) != 0) 
{ 
    printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status)); 
} 

USR1 Handler:

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

Sieht aus wie die beste Antwort so neu zu schreiben ist, dass Threads nicht auf IO warten: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

+0

der Arbeiter-Thread wartet auf eine Semaphore für externe Ereignisse, wenn er wartet, so dass die offensichtlichste ist eine Prüfung für Thread Cancellation hinzuzufügen. Es gibt einige begrenzte blockierende E/A, aber das ist nicht die erwartete Ursache des Threads, der nicht mehr reagiert. Ich hatte gehofft, Signale für das Herunterfahren von Threads zu vermeiden, da dies das Hacken von Sigmasks in jedem Thread, IME, erfordert. –

+2

Ja ist es schade das ist nicht in der aktuellen Android NDK, fügt einige lästige Aufgaben hinzu. Die Freuden der Multi-Plattform-Entwicklung. Wir haben ziemlich einfach unsere Threading-Bibliothek portiert, da wir pthread_cancel oder Semaphore nicht verwenden müssen, aber es sieht so aus, als ob sich eine Art Rewrite/Interface-Implementierung aufgrund der fehlenden ändern muss. –

+0

Der Aufruf von 'pthread_exit()' in einem Signal-Handler ist im Grunde die asynchrone Löschung (siehe 'pthread_setcanceltype()'). Dies ist gefährlich und schwer zu verwenden. Eine verzögerte Stornierung ist einfacher zu verwenden, da sie nur bei bestimmten Abbruchpunkten storniert (obwohl dies immer noch ein erheblicher Aufwand ist), aber es ist auch schwieriger, sie für die Threading-Bibliothek zu implementieren. – jilles

0

I machte eine kleine Bibliothek, die sich darum kümmert.

Es nutzt einige ungenutzte Bits der bionischen Gewindestruktur aus.

Ich nannte es libbthread :)

Genießen;)