2011-01-05 28 views
19

Android NDK'ya C++ kodunun orta boyutlu bir gövdesini yerleştiriyorum. Ne yazık ki pthreads uygulaması (yine de NDK v5'ten itibaren) eksik. Özellikle, bizim uygulama bir çalışan iş parçacığı öldürmek için pthread_cancel() dayanmaktadır. NDK pthread_cancel() uygulamıyor! İşçi iş parçacığı normal yanıt verirken başka açık yanıtlar vardır. Ancak, çalışan iş parçacığının yanıt vermediği durumlarda (ör. Sonsuz döngü), tüm süreci öldürmeden nasıl iptal edebilirim?pthread_cancel() alternatifleri?

cevap

14
bu adamın çalıştığı

Olası seçenek: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

diye burada yeniden gönderiliyor: Sonra bu pthread çıkmak için bir SIG_USR1 sinyalini tetiklemek ve sinyal işleyici, kullanmak pthread_kill kullanmak ve güvenilir o

, ancak bu tür bir yöntem için dezavantajının olup olmadığını merak ediyor.

Zamanlayıcı dışarı:

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

USR1 işleyicisi:

en iyi yanıtı ipler IO bekleyen değildir böylece yeniden yazmak için gibi
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); 
} 

görünüyor: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

+0

çalışan iş parçacığı bekler;

Ben libbthread :)

Enjoy çağırdı. Bazı sınırlı G/Ç engelleme vardır, ancak iş parçacığının yanıt vermemesinin beklenen nedeni bu değildir. İş parçacığı kapatma sinyallerini kullanmaktan kaçınmayı umuyordum çünkü bu, her bir iş parçacığında, IME'de hack sigmaskları gerektirir. –

+2

Evet, geçerli Android NDK'de olmayan bir utanç, bazı can sıkıcı görevler ekler. Çok platformlu gelişimin sevinçleri. Pthread_cancel veya semaforlarını kullanmak zorunda kalmayacağımızdan, iş parçacığı kütüphanemizi oldukça kolay bir şekilde yükledik, ancak bir çeşit yeniden yazma/arayüz uygulamasının eksiklik nedeniyle değişmesi gerekecek gibi görünüyor. –

+0

Sinyal işleyicide 'pthread_exit()' ifadesi temel olarak asenkron iptalin ne olduğunu gösterir (bkz. 'Pthread_setcanceltype()'). Bu, doğru ve kullanımı zor bir işlemdir. Ertelenmiş iptali, sadece belirli iptal noktalarında iptal ettiği için doğru kullanımı daha kolaydır (yine de büyük çaba olsa da), ancak iş parçacığı kütüphanesi için uygulanması da daha zordur. – jilles

0

I bununla ilgilenen küçük bir kütüphane yaptı. Biyonik iplik yapısının bazı kullanılmayan bitlerini kullanır. o bekler zaman bu iş parçacığı iptali için bir çek eklemek bariz bir yer yani,) dış olaylar için bir semaforda