проблемы завершение треда (pthread)
Работает.
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
void * fn (void * t)
{
int fd;
int ic;
int a;
ic = pthread_setcancelstate (PTHREAD_CANCEL_ENABLE , &a);
printf ("___state___%d___\n", ic);
ic = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &a);
printf ("___type___%d___\n", ic);
fd = open("1.c", O_RDONLY);
printf ("opened fd = %d\n", fd);
close (fd);
while (1)
{
a++; printf ("^"); usleep (100000);
}
}
int main
{
int ic;
pthread_t th;
ic = pthread_create (&th, 0, fn, 0);
printf ("___create___%d___\n", ic);
usleep (1000000);
ic = pthread_cancel (th);
printf ("___cancel___%d___%d___\n", ic, ESRCH);
ic = pthread_join(th, NULL);
printf ("___join___%d___\n", ic);
}
На экране видим:
___state___0___
___type___0___
opened fd = -1
^___create___0___
^^^^^^^^^^___cancel___0___3___
___join___0___
Считаем галочки. Делаем выводы.
glibc-kernheaders-2.4-8.10
glibc-common-2.3.2-11.9
glibc-devel-2.3.2-11.9
glibc-2.3.2-11.9
Народ, надо давать существующий файл! Я думал это и так понятно. Если файл не открывается, то и у меня работает. Поменяй 1.c в /dev/zero и попробуй снова.
___state___0___
___type___0___
opened fd = 3
^___create___0___
^^^^^^^^^___cancel___0___3___
___join___0___
Что на это скажешь?
Ну может все-таки у тебя pthread_cancel на close или printf попадает? Тогда вроде такое поведение вероятно. Свою конфигурацию запость -- glibc и т.д.
Оставить комментарий
Landstreicher
Возникают проблемы с насильственным завершением треда, напримерПрограмма запускается и входит в бесконечный цикл, игнорируя pthread_cancel. Если убрать вызовы open/close - работает правильно (сразу завершается). Эффект не воспроизводится на glibc-2.2. Владельцы glibc-2.3 - проверьте у себя, плз.
В чем дело?