Странное поведение примера работы потоков из статьи [Закрыт]

Рейтинг: 0Ответов: 1Опубликовано: 31.03.2011

Доброго времени суток.

Читаю статью Программирование для Linux: потоки, в ней есть пример использование точек анулирования и макросов pthread_cleanup_{push|pop}. Но при выполнении этого примера на моем компьютере он работает не совсем так, как написано в статье. Там написано, что поток должен вывести на экран 4 строки и только потом завершиться, а он почему то не выводит.

Вот этот пример:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>

void exit_func(void * arg)
{
    free(arg);
    printf("Freed the allocated memory.\n");
}
void * thread_func(void *arg)
{    
    int i;
    void * mem;
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
    mem = malloc(1024);
    printf("Allocated some memory.\n");
    pthread_cleanup_push(exit_func, mem);
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    for (i = 0; i < 4; i++) {
        sleep(1);
        printf("I'm still running!!!\n");
    }
    pthread_cleanup_pop(1);
}
int main(int argc, char * argv[])
{   
    pthread_t
    thread;
    pthread_create(&thread, NULL, thread_func, NULL);
    pthread_cancel(thread);
    pthread_join(thread, NULL);
    printf("Done.\n");
    return EXIT_SUCCESS;
}

В чем может быть проблема? Прошу разъяснить.
П.С. ОС ALTLinux 5.1. Компилирую так: gcc main.cpp -lpthread -o threads

Ответы

▲ 3Принят

Там написано, что поток должен вывести на экран 4 строки и только потом завершиться

Если там так написано - это враньё. Дело не только в скорости. Как только вы делаете поток CANCELABLE... он тут же и прерывается при вызове sleep.

Вот из документации к Solaris:

Be careful to cancel a thread only when cancellation is safe. The pthreads standard specifies several cancellation points, including:

  • Programmatically, establish a thread cancellation point through a pthread_testcancel call.

  • Threads waiting for the occurrence of a particular condition in pthread_cond_wait or pthread_cond_timedwait(3C).

  • Threads blocked on sigwait(2).

  • Some standard library calls. In general, these calls include functions in which threads can block. See the cancellation(5) man page for a list.

Если пойти в cancellation(5) и почитать, то можно обнаружить в списке sleep, pwrite и write. Это будет значить, что поток будет прерываться при вызове printf или sleep и ещё во многих других случаях.

Таким образом, поведение примера полностью соответствует спецификации.