функция pthread_join в c

У меня проблема с pthread_join(), надеюсь, все ответят. Я запускаю программу ниже, и мне нужно распечатать одну строку. После этого я пытаюсь удалить «pthread_join (th, & val)», и строка не распечатывается.

Я обнаружил все функции в программе, но я не понимаю, почему.

Можете ли вы помочь мне, я ценю все ответы.

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

#define SMALL_STACK 131072

pthread_attr_t thread_attr;
void* fn(void* arg);
int main(int argc, char** argv)
{
    pthread_attr_init(&thread_attr);
    pthread_attr_setstacksize(&thread_attr, SMALL_STACK);

    pthread_t th;

    pthread_create(&th, &thread_attr, fn, (void*)14);
    void* val;
    pthread_join(th, &val);

    return 0;
}

void* fn(void* arg)
{
    printf("arg = 0x%x\n", (int)arg);
    return NULL;
}

person Hoang    schedule 14.03.2015    source источник


Ответы (1)


Да, это то, для чего предназначен pthread_join. Он заставляет вызывающий поток ждать, пока созданный поток не выполнит свою работу. Если у вас его нет, ваш поток main завершит весь процесс до того, как ваш поток fn сможет распечатать.

Если по какой-то причине вы хотите завершить поток main и оставить все остальные потоки процесса в рабочем состоянии, вам придется завершить его с помощью pthread_exit, а не с помощью оператора return и не с помощью вызова exit.

person Jens Gustedt    schedule 14.03.2015
comment
Спасибо за ваш ответ. Я до сих пор не понимаю несколько моментов. Вы сказали: если у вас его нет, ваш основной поток завершает весь процесс до того, как ваш поток fn сможет распечатать. Как вы понимаете, хотя у вас нет pthread_join(), fn() все еще может быть вызван (означает, что есть печатная строка). Я так не думаю, я думаю, что это никогда не будет напечатано, если не было pthread_join(). Pthread_create() только создает, но не выполняет. Я не носитель английского языка, прошу вас посочувствовать. - person Hoang; 14.03.2015
comment
Нет, вы не правы. pthread_create запускает поток, нет такой вещи, как создание потока без его выполнения. Что бы это значило? Если вы завершаете функцию main, это завершает процесс и, следовательно, все потоки в этом же процессе. - person Jens Gustedt; 14.03.2015
comment
Pthread_create запускает поток, после чего поток будет выполняться с вызванной функцией fn. Но основная функция завершается раньше, поэтому поток еще не выполнил функцию fn (нет напечатанной строки). Выполнение потока ожидания Pthread_join() выполняется до завершения основной функции. Я правильно сказал? - person Hoang; 14.03.2015
comment
Почти. Поток начинает выполнение fn, но посреди выполнения вычислений для printf процесс завершается. printf — медленная функция, и выходным данным требуется некоторое время, чтобы поступить на ваш терминал. - person Jens Gustedt; 14.03.2015
comment
Теперь я понимаю. У меня есть вопрос . Откуда вы это знаете, я прочитал много документов, но не нашел того, что вы сказали? Я ожидаю, что вы предоставите соответствующий документ. - person Hoang; 14.03.2015