使用线程计算两个数字的总和

时间:2015-05-09 17:15:51

标签: c unix segmentation-fault pthreads

我写了这个小程序来读取用户的两个数字并使用线程函数计算它们的总和,该函数还负责在屏幕上显示结果。

int global[2];

void *sum_thread(void *arg)
{
    int *args_array;
    args_array = *(int**)arg;

    int n1,n2,sum;
    n1=args_array[0];
    n2=args_array[1];
    sum = n1+n2;

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

    return NULL;
}

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

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

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

    return 0;
}

但是,当我运行代码时,由于分段错误,它无法正常工作。我想我正在尝试访问/使用未分配的内存。我应该用malloc分配它还是其他我做错了?

2 个答案:

答案 0 :(得分:2)

数组的名称local found = false for _, v in ipairs(fruits) do if v == value then found = true break end end if not found then print ( value .. " is not a fruit" ) end 指向数组的基址。你可以简单地传递它并在你的线程函数中使用它。

但是,仅提一个逻辑点,如果您将global作为参数传递给global函数,则它不必是全局

在您的代码中,更改

sum_thread()

pthread_create(&tid_sum,NULL,sum_thread,(void*)&global);

然后,在pthread_create(&tid_sum,NULL,sum_thread,global); 函数

sum_thread()

args_array = *(int**)arg;

答案 1 :(得分:0)

您传递(void*)&global作为线程启动函数的参数。 &global的类型是(*)int [2] - 指向两个int数组的指针。这与int **不同,并且与int不兼容,void *sum_thread(void *arg) { int n1,n2,sum; n1=global[0]; n2=global[1]; sum = n1+n2; printf("N1 + N2 = %d\n",sum); return NULL; } 是指向{{1}}的指针。数组不是指针。

@SouravGhosh已经提供了一个解决方案,可以正确输入,并且应该可以正常工作。然而,我观察到,在这种特殊情况下,将指针传递给全局数组有点愚蠢,因为线程可能只是直接读取数组:

{{1}}