C语言多线程添加将不起作用

时间:2018-11-29 14:14:04

标签: c pthreads

我给4个数字。我想对不同线程中的前两个和后两个求和。我创建了一个程序,该程序可以正确添加前两个数字,但不能正确添加下两个数字。我刚刚开始学习pthread的工作原理,因此将不胜感激。

2             

3 个答案:

答案 0 :(得分:2)

这里有两个问题。首先,数组global只能容纳3个元素,但是您尝试设置4个元素。 3是用于声明 size 的声明,而不是最大元素的索引。因此将大小设置为4:

int global[4];

第二,两个线程函数都添加了相同的元素。您需要让其中一个获取数组索引0和1,另一个获取数组索引2和3。

n3=args_array[2];
n4=args_array[3];

答案 1 :(得分:1)

更改此

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

n3=args_array[2];
n4=args_array[3];

答案 2 :(得分: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;
}
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个