Альтернативы pthread_cancel() в Android NDK?

Я переношу кусок кода С++ среднего размера на Android NDK. К сожалению, реализация pthreads (как и NDK v5, во всяком случае) является неполной. В частности, наше приложение полагается на pthread_cancel(), чтобы убить рабочий поток. NDK не реализует pthread_cancel()! Существуют и другие очевидные ответы, когда рабочий поток отвечает нормально. Но в тех случаях, когда рабочий поток не отвечает (например, бесконечный цикл), как я могу отменить его, не убивая весь процесс?

Ответ 1

Возможный вариант, который работает для этого парня: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

Перестановка здесь в случае:

Затем я использую pthread_kill для запуска Сигнал сигнала и использования сигнала SIG_USR1 чтобы выйти из этого pthread и попробовал, он работает, но все же интересно, если недостатки такого метода.

Таймер:

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

Обработчик 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);
}

Похоже, лучший ответ - переписать так, чтобы потоки не ожидали в IO: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

Ответ 2

Я сделал небольшую библиотеку, которая позаботится об этом.

Он использует некоторые неиспользуемые биты структуры бионного потока.

Я назвал его libbthread:)

Наслаждайтесь;)