проблемы завершение треда (pthread)

Landstreicher

Возникают проблемы с насильственным завершением треда, например


#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
void* bug (void *t)
{
int fd;
int a;
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
fd = open("1.c", O_RDONLY);
printf("opened fd = %d\n", fd);
close(fd);
while (1) {
a++;
}
}
int main
{
pthread_t th;
int retval;
pthread_create(&th, 0, bug, 0);
usleep(100000);
pthread_cancel(th);
pthread_join(th, &retval);
}


Программа запускается и входит в бесконечный цикл, игнорируя pthread_cancel. Если убрать вызовы open/close - работает правильно (сразу завершается). Эффект не воспроизводится на glibc-2.2. Владельцы glibc-2.3 - проверьте у себя, плз.
В чем дело?

duantusova

RedHat 9, kernel-2.4.20-20.9, glibc-2.3.2-27.9
Работает.

mama10001

Попробуй проанализировать возвращаемые значения


#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

Landstreicher

Народ, надо давать существующий файл! Я думал это и так понятно. Если файл не открывается, то и у меня работает. Поменяй 1.c в /dev/zero и попробуй снова.

Andreika68

Вот результат с существующим файлом:


___state___0___
___type___0___
opened fd = 3
^___create___0___
^^^^^^^^^___cancel___0___3___
___join___0___


Что на это скажешь?

evgeha

Ну может все-таки у тебя pthread_cancel на close или printf попадает? Тогда вроде такое поведение вероятно. Свою конфигурацию запость -- glibc и т.д.
Оставить комментарий
Имя или ник:
Комментарий: