Ошибка сегментации с использованием потоков pthread при выполнении сложения? - PullRequest
0 голосов
/ 05 мая 2020

Я пишу программу, которая в основном выполняет сложение двух значений, заданных пользователем. Это моя первая попытка многопоточности. Каждый раз, когда я ввожу первое значение, появляется ошибка «Ошибка сегментации (дамп ядра)».

void *printSum();

void main()
{
    int *a,*b,*add;
    printf("Enter first number: ");
    scanf("%d",a);                    //error here
    printf("Enter second number: ");
    scanf("%d",b);

    pthread_t thread;
    pthread_create(&thread, NULL, printSum, NULL);
}

void *printSum()
{
    int *a,*b,*add;
    *add = *a + *b;
    printf("Sum = %d", *add);
    pthread_exit(0);
} 

Я инициализировал те же переменные в printSum (), потому что в противном случае я получаю сообщение об ошибке, говорящее, что переменные не объявлены. Что мне делать?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Сначала main начинается как первый поток, затем pthread_create () создает новый поток, так что теперь у нас есть два потока. Проблема здесь в том, что программа завершается до того, как новый поток завершает свою работу, отсутствует функция pthread_join (), заставляющая main () ждать, пока print_Sum () завершит свои задачи. Кроме того, вы предоставили указатели, но без памяти для них, я решил создать структуру для передачи чисел в поток (последний параметр pthread_create ()), а затем преобразовать arg в эту структуру.

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

void *printSum(void *arg);

struct portions {
        int a;
        int b;
};

int main(void)
{
        struct portions a;
        printf("Enter first number: ");
        scanf("%d",&a.a);
        printf("Enter second number: ");
        scanf("%d",&a.b);


        pthread_t thread;
        pthread_create(&thread, NULL, printSum, &a);
        pthread_join(thread, NULL);
        return 0;
}

void *printSum(void *arg)
{
        struct portions *a = (struct portions *)arg;
        int add;

        add = a->a + a->b;
        printf("Sum = %d", add);
}
0 голосов
/ 05 мая 2020
        int *a,*b,*add;
        printf("Enter first number: ");
        scanf("%d",*&a);

Вы не выделили память для a. Также это *&a <==> a.

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