Программа не выходит после использования таймеров POSIX - PullRequest
3 голосов
/ 06 апреля 2011

Рассмотрим следующую программу:

#define _POSIX_C_SOURCE 200809L
#include <time.h>
#include <pthread.h>
#include <signal.h>

void timerfunc(union sigval val) { }

int main()
{
        struct sigevent sev = { .sigev_notify = SIGEV_THREAD,
                .sigev_notify_function = timerfunc };
        timer_t t;
        timer_create(CLOCK_REALTIME, &sev, &t);
        timer_delete(t);
        pthread_exit(0);
}

Связанный с glibc, он не только не завершается, но и не может быть уничтожен, кроме как kill -9 / SIGKILL.Это поведение разрешено стандартом?Есть ли хорошие обходные пути, кроме как всегда явно выходить из процесса (в отличие от простого выхода из всех потоков)?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Ну, POSIX специально говорит это

... невозможно определить время жизни созданной темы ...

, что означает, что разрешено любое время жизни.

SIGEV_THREAD просто плохое моджо, и его следует избегать.

0 голосов
/ 07 апреля 2011

Работает ли pthread_exit с основным потоком процесса?Мне всегда было интересно, работают ли функции pthread в потоках, не созданных pthread_create.

...