используя pthread_exit и pthread_join.pthread_exit не завершает вызывающую функцию - PullRequest
1 голос
/ 24 апреля 2011

gcc 4.6.0 c89

Я просто экспериментирую с использованием pthread_exit и pthread_join.

Единственное, что я заметил с pthread_exit, это то, что он не отображал сообщение печати до возвращения main. Однако pthread_join сделал именно это.

Я бы подумал, что заявление на печать должно было отображаться. Если нет, значит ли это, что main не завершил корректно использование pthread_exit?

Большое спасибо за любые предложения,

Мой фрагмент исходного кода. Source.c file:

void* process_events(void)
{
    app_running = TRUE;
    int counter = 0;

    while(app_running) {
#define TIMEOUT 3000000
        printf("Sleeping.....\n");
        usleep(TIMEOUT);

        if(counter++ == 2) {
            app_running = FALSE;
        }
    }

    printf("Finished process events\n");

    return NULL;
}

Фрагмент исходного кода main.c file:

int main(void)
{
    pthread_t th_id = 0;
    int th_rc = 0;

    th_rc = pthread_create(&th_id, NULL, (void*)process_events, NULL);
    if(th_rc == -1) {
        fprintf(stderr, "Cannot create thread [ %s ]\n", strerror(errno));
        return -1;
    }

    /*
     * Test with pthread_exit and pthread_join
     */

    /* pthread_exit(NULL); */

    if(pthread_join(th_id, NULL) == -1) {
        fprintf(stderr, "Failed to join thread [ %s ]", strerror(errno));
        return -1;
    }

    printf("Program Terminated\n");

    return 0;
}

1 Ответ

1 голос
/ 24 апреля 2011

То, что вы видите, ожидается. pthread_exit никогда не возвращается. Он останавливает поток, который вызывает его немедленно (и затем запускает обработчики очистки, если таковые имеются, а затем потенциально деструкторы данных, специфичные для потока).

Ничто в main после pthread_exit никогда не будет работать.

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