Многопоточное сложение языка C не будет работать - PullRequest
0 голосов
/ 29 ноября 2018

Я даю 4 номера.Я хочу суммировать первые два, а затем следующие 2 в разных темах.Я создал программу, которая может правильно добавлять первые два числа, но не следующие 2. Я только начал изучать, как работают pthreads, поэтому любая помощь будет оценена.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[3];

void *sum_thread(void *arg)
{
    int *args_array;
    args_array = arg;
    int n1,n2,sum;
    n1=args_array[0];
    n2=args_array[1];
    sum = n1+n2;

    printf("N1 + N2 = %d\n",sum);

    return sum;
}
void *sum_thread1(void *arg)
{
    int *args_array;
    args_array = arg;
    int n3,n4,sum2;
    n3=args_array[0];
    n4=args_array[1];
    sum2=n3+n4;

    printf("N3 + N4 = %d\n",sum2);

    return sum2;
}



int main()
{
    printf("First number: ");
    scanf("%d",&global[0]);

    printf("Second number: ");
    scanf("%d",&global[1]);

    printf("Third number: ");
    scanf("%d",&global[2]);

    printf("Fourth number: ");
    scanf("%d",&global[3]);

    pthread_t tid_sum;
    pthread_create(&tid_sum,NULL,sum_thread,global);
    pthread_join(tid_sum,NULL);

    pthread_t tid_sum1;
    pthread_create(&tid_sum1,NULL,sum_thread1,global);
    pthread_join(tid_sum1,NULL);

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Вы только что написали неправильные индексы во втором потоке, это должно работать:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[4];

void *sum_thread(void *arg)
{
    int *args_array;
    args_array = arg;
    int n1,n2,sum;
    n1=args_array[0];
    n2=args_array[1];
    sum = n1+n2;

    printf("N1 + N2 = %d\n",sum);

    return sum;
}
void *sum_thread1(void *arg)
{
    int *args_array;
    args_array = arg;
    int n3,n4,sum2;
    //this is args_array[2] and not args_array[0]
    n3=args_array[2];
    //this is args_array[3] and not args_array[1]
    n4=args_array[3];
    sum2=n3+n4;

    printf("N3 + N4 = %d\n",sum2);

    return sum2;
}



int main()
{
    printf("First number: ");
    scanf("%d",&global[0]);

    printf("Second number: ");
    scanf("%d",&global[1]);

    printf("Third number: ");
    scanf("%d",&global[2]);

    printf("Fourth number: ");
    scanf("%d",&global[3]);

    pthread_t tid_sum;
    pthread_create(&tid_sum,NULL,sum_thread,global);
    pthread_join(tid_sum,NULL);

    pthread_t tid_sum1;
    pthread_create(&tid_sum1,NULL,sum_thread1,global);
    pthread_join(tid_sum1,NULL);

    return 0;
}

Поскольку два потока практически выполняют одни и те же операции, вы можете просто объявить одну подпрограмму потока и передать правильные указатели:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[4];

void *sum_thread(void *arg)
{
    int *args_array;
    args_array = arg;
    int n1,n2,sum;
    n1=args_array[0];
    n2=args_array[1];
    sum = n1+n2;

    printf("N1 + N2 = %d\n",sum);

    return sum;
}

int main()
{
    printf("First number: ");
    scanf("%d",&global[0]);

    printf("Second number: ");
    scanf("%d",&global[1]);

    printf("Third number: ");
    scanf("%d",&global[2]);

    printf("Fourth number: ");
    scanf("%d",&global[3]);

    pthread_t tid_sum, tid_sum1;
    pthread_create(&tid_sum,NULL,sum_thread,global);
    pthread_create(&tid_sum1,NULL,sum_thread,global + 2);
    pthread_join(tid_sum,NULL);
    pthread_join(tid_sum1,NULL);

    return 0;
}

также глобальная переменная должна содержать 4 элемента, а не 3

0 голосов
/ 29 ноября 2018

Здесь есть две проблемы.Сначала массив global может содержать только 3 элемента, но вы пытаетесь установить 4 элемента.3 - это объявление, указывающее размер , а не индекс самого большого элемента.Поэтому установите размер 4:

int global[4];

Во-вторых, обе функции потока добавляют одинаковые элементы.Вам нужно, чтобы один из них получил индексы массива 0 и 1, а другой - индексы массива 2 и 3.

n3=args_array[2];
n4=args_array[3];
0 голосов
/ 29 ноября 2018

изменить

n3=args_array[0];
n4=args_array[1];

на

n3=args_array[2];
n4=args_array[3];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...