Ожидание завершения pthread_cancel - PullRequest
3 голосов
/ 07 августа 2011

Я использую pthreads, которые не выделяют никаких локальных переменных. По причинам, о которых я не буду здесь говорить, мне нужна опция pthread_cancel(), и потоки, которые я пишу, должны поддерживать ее (нет ресурсов для очистки, ОК, чтобы остановить выполнение в любой момент). В настоящий момент у меня есть проблема, потому что pthread_cancel возвращается до того, как pthread фактически завершит работу, вызывая проблемы для общих ресурсов, к которым я хочу прикоснуться только после отмены потока.

Могу ли я узнать, когда мой pthread окончательно и правильно завершил? Возможно, есть функция для этого, которую я не нашел, или параметр, с которым я не знаком?

Будет

pthread_cancel(thread_handle);
pthread_join(thread_handle, NULL);

сделать трюк, или это не гарантировано (поскольку thread_handle может быть уже недействительным)?

Я довольно новичок в pthreads, так что лучшие практики приветствуются (помимо "не используйте pthread_cancel()", которые я уже выучил: P).

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

Страница справочника kernel.org фактически делает это.Это безопасно.

s = pthread_cancel(thr);
if (s != 0)
    handle_error_en(s, "pthread_cancel");

/* Join with thread to see what its exit status was */

s = pthread_join(thr, &res);
if (s != 0)
    handle_error_en(s, "pthread_join");
1 голос
/ 02 сентября 2011

Пока вы не вызовете pthread_join в присоединяемом потоке, его tid остается действительным. Если поток является присоединяемым (что должно быть безопасным для pthread_cancel), тогда дескриптор thread_able должен быть действительным.

Если нить была отсоединена, было бы небезопасно вызывать pthread_cancel. Что если поток завершается так, как вы его назвали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...