C Почему количество потоков, созданных в моем коде, несовместимо? - PullRequest
0 голосов
/ 08 марта 2019

Цель моего назначения - создать цикл для порождения 5 потоков с целочисленными аргументами от 0 до 4. У меня есть 3 файла: thread_demo.c, который содержит основную функцию, worker.c, который содержит функцию для вычисления квадратаАргумент и header.h, чтобы сохранить 2 файла вместе.

thread_demo.c

#include "header.h"
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>

#define NUM_THREADS 5
#define PROMPT_SIZE 5

int main(){
        pthread_t threads[NUM_THREADS];
        pthread_attr_t pthread_attributes;

        int *prompt;
        scanf("%d", &prompt);

        for(int i = 0; i < NUM_THREADS; i++){
                pthread_create(&threads[i], &pthread_attributes, &worker, (void *) prompt);
        } 
} 

worker.c

#include "header.h"
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void *worker(void * num){
        int *input;
        input = (int*) &num;

        // Calculate square
        int output = *input * *input;

        printf("The square of %d", *input);
        printf(" is %d.\n", output);

        pthread_exit(NULL);
}

У меня нет ошибок компиляции, но количество потоков, порождаемых моим кодом, не согласовано.Показанные изображения являются моими результатами ввода «5» 3 разных времен, когда я не вносил изменения в код.Я не уверен, что вызывает это, я знаю, что что-то упустил, но я не знаю, что это такое.Я также должен заставить «главный поток ждать, пока все потоки не завершатся», что меня смущает.Когда я порождаю 5 потоков, как узнать, какой из них является основным?Я никогда не писал код, связанный с процессами и потоками, поэтому я полностью потерян.Любая помощь будет принята с благодарностью!

enter image description here

enter image description here

enter image description here

1 Ответ

2 голосов
/ 08 марта 2019

Ваша программа, вероятно, завершает работу до того, как завершатся все ваши потоки.Это объясняет, почему вы видите разные выходные данные при разных запусках: иногда ваша программа выходит более или менее быстро, позволяя выполнять меньше или больше работы.

Вам необходимо не допустить выхода из вашей программы (возврат с main()) пока все ваши темы не закончены.Для этого вы можете использовать pthread_join для каждого из потоков.Добавьте после создания всех потоков:

for(int i = 0; i < NUM_THREADS; i++) {
    pthread_join(threads[i]);
}

ptread_join будет блокироваться (останавливать выполнение в этой строке) до тех пор, пока поток не прекратится.

Из документов:

Функция pthread_join () ожидает завершения потока, указанного потоком.Если этот поток уже завершен, то функция pthread_join () возвращается немедленно.Нить, указанная в thread, должна быть присоединяемой.

http://man7.org/linux/man-pages/man3/pthread_join.3.html

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