簡體   English   中英

線程和並行編程

[英]Threads and parallel programming

假設我想計算 n 個復數的乘積。

我想要做的是計算線程中 2*i 和 2*i+1 (i=0;i<n/2)復數的乘積。 即,將 2 個數字聚集在一起並計算它們的乘積,因此我將得到 n/2 個乘積。 然后再次對這些 n/2 產品執行相同的操作。 依此類推,直到n的值為1。

這是我的代碼

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
struct complex{
    int a;
    int b;
};
struct complex arr[1000];
struct arg {
    struct complex arr1;
    struct complex arr2;
    int i;
};
//struct arg *argv;
struct arg *argv=malloc(sizeof(struct arg));
void *multiplier(struct arg *argv)
{
    int real,imaginary;
    real=(argv->arr1.a)*(argv->arr2.a)-(argv->arr1.b)*(argv->arr2.b);
    imaginary=(argv->arr1.a)*(argv->arr2.b)+(argv->arr1.b)*(argv->arr2.a);
    arr[argv->i].a=real;
    arr[argv->i].b=imaginary;
    printf("real=%d imaginary=%d no=%d\n",real,imaginary,argv->i);
    pthread_exit(0);
}
int main(void)
{
    int n,i,j,flag=0,q;
    pthread_t tid;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d + i%d",&arr[i].a,&arr[i].b);
    for(i=0;i<n;i++)
        printf("%d + i%d\n",arr[i].a,arr[i].b);
    while(n!=0)
    {
        if(n%2==1)
            flag=1;
        else
            flag=0;
        for(i=0;i<n/2;i++)
        {
            argv->arr1.a=arr[2*i].a; /* SEG FAULT HERE */
            argv->arr1.a=arr[2*i].b;
            argv->arr2.a=arr[2*i+1].a;
            argv->arr2.a=arr[2*i+1].b;
            argv->i=i;
            pthread_create(&tid,&attr,multiplier,(void *) argv);
        }
        pthread_join(tid,NULL);
        if(flag==1)
        {
            arr[n/2].a=arr[n-1].a;
            arr[n/2].b=arr[n-1].b;
        }
        n=n/2;
    }
    return(0);
}

然而,我的代碼在第 45 行給了我段錯誤。我一直試圖找出它有什么問題,但無濟於事。 我可能犯了一個根本可怕的錯誤,但請幫助我。

編輯 1:可能是有史以來最愚蠢的錯誤。 我不能像剛才那樣全局分配內存。

我剛剛將 Malloc 插入到 main 函數中,程序就可以運行了。

每個線程都需要通過argv傳入自己的內存,以免覆蓋其他線程數據。

所以你可能會謊稱移動這條線

struct arg * argv = malloc(sizeof(struct arg));

到這里:

for(i = 0; i < n/2; ++i)
    {
        struct arg * argv = malloc(sizeof(*argv));
        argv->arr1.a = arr[2*i].a; 

另外檢查調用malloc()的結果可能不是一個壞主意。


然后讓線程函數free()它的內存:

void * multiplier(struct arg * argv)
{
    ...

    free(argv);

    pthread_exit(0);
}

還要傳遞給pthread_create()的線程函數定義為:

void *(*)(void *)

所以你應該這樣聲明你的:

void * multiplier(void * pvargv)
{
    struct arg * argv = pvargv;
    ...

很難弄清楚你的哪一行是第 45 行。

此外,這看起來非常錯誤:

struct arg *argv=malloc(5*sizeof(struct complex));

像這樣的錯誤匹配類型很少是正確的,並且struct complex看起來與struct arg ,所以這看起來真的很奇怪。 此外,你不應該有一個全局命名的argv而你

首先,我不確定您為argv分配的內存大小是否足夠合理。 其次,你修改這個argv東西,創建一個線程並立即覆蓋它,可能是在線程得到它之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM