pthread_cancel () альтернативы в Android NDK? - PullRequest
20 голосов
/ 06 января 2011

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

Ответы [ 2 ]

16 голосов
/ 06 января 2011

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

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

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

Таймер:

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

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

0 голосов
/ 14 апреля 2016

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

Используются некоторые неиспользованные биты структуры бионического потока.

Я назвал это libbthread :)

Наслаждайся;)

...