почему адрес памяти sum (& sum) необходим для передачи в функцию pthread_exit для получения правильного вывода из программы pthread снизу? - PullRequest
0 голосов
/ 16 марта 2020

Я не понимаю, что функция pthread_exit (& sum) делает ниже кода?

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>

void *
sum_runner(void *arg)
{

    int *limit_ptr = (int *) arg;
    int limit = *limit_ptr;

    int sum = 0;

    for (int i; i <= limit; i++) {
        sum += i;
    }
    printf("sum is for thread %lu is %d : \n", pthread_self(), sum);
    pthread_exit(&sum);

}

int
main(int argc, char **argv)
{

    if (argc < 2) {
        printf("You entered only number %s : \n", argv[0]);
        exit(-1);
    }
    int nOfThreads = argc - 1;
    int i;
    int limit[nOfThreads];

    printf("limit  = %d \n", nOfThreads);
    for (i = 0; i < nOfThreads; i++) {

        limit[i] = atoll(argv[i + 1]);
        printf("%d, %p\n", limit[i], &limit[i]);
        pthread_t tid[i];

        pthread_create((tid + i), NULL, sum_runner, (limit + i));
    }

    for (i = 0; i < nOfThreads; i++) {
        pthread_t tid[i];

        pthread_join(*(tid + i), NULL);
    }
}

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

1 Ответ

0 голосов
/ 17 марта 2020

Наконец-то я разобрался с проблемой. Это было pthread_t tid [i]; . Он должен быть объявлен в глобальной области видимости вместо области видимости l oop. В моем случае, как и в l oop scope, функция pthread_join () не заставляет основной поток (основную функцию) ждать, пока все созданные потоки не завершат sh свое выполнение. окончательный код должен быть таким, как показано ниже,

**pthread_t tid[i];**

for (i = 0; i < nOfThreads; i++) {

    limit[i] = atoll(argv[i + 1]);
    printf("%d, %p\n", limit[i], &limit[i]);
    pthread_create((tid + i), NULL, sum_runner, (limit + i));
}

for (i = 0; i < nOfThreads; i++) {

    pthread_join(*(tid + i), NULL);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...