将Array作为参数传递给C中的新线程

问题描述 投票:1回答:4

我试图使用pthread_create将数组作为参数传递给新线程中的函数,这可能吗?我有一个整数数组和一个从创建线程方法调用的计算平均方法,但我似乎无法正确地将我的数组传递给方法。这是我的代码:int nums [];

int average;

int size = 0;


void *calcAvg(int *nums[]);

int main(int argc, char *argv[]){
    /* initialize an array of the integers to be passed */
    nums[argc - 1];
    for(int i = 0; i < argc - 1; i++){
        nums[i] = atoi(argv[i + 1]);
        size++;
    }

    /* Thread Identifier */
    pthread_t avgThread;

    pthread_create(&avgThread, NULL, calcAvg, nums);

    pthread_join(avgThread, NULL);

    printf("average= %d", average);
}

void *calcAvg(int *nums[]){
    int sum;
    for(int i = 0; i < size; i++){
        sum += nums[i];
    }
    average = sum / (size);
    pthread_exit(0);
}
c arrays multithreading
4个回答
5
投票

您的代码中存在很多问题,我修复了一些编译希望它会有所帮助

compile:gcc -o main main.c -lpthread

执行:./main 2 5

输出:3

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

int average;

int size = 0;


void *calcAvg(void *arg);
int main(int argc, char *argv[]){
  /* initialize an array of the integers to be passed */
  int *nums = (int*)malloc((argc - 1)*sizeof(int));
  int i = 1;
  for(i = 1; i < argc ; i++){
    nums[i-1] = atoi(argv[i]);
    size++;
  }

  /* Thread Identifier */
  pthread_t avgThread;

  pthread_create(&avgThread, NULL, calcAvg, (void*)nums);

  pthread_join(avgThread, NULL);
  printf("average = %d \n",average);
  free(nums);

}
void *calcAvg(void *arg){
  int *val_p = (int *) arg;
  int sum = 0;
  int i = 0;
  for( i = 0; i < size; i++){
    sum += val_p[i];
  }
  average = sum / (size);
  pthread_exit(0);
}

1
投票

更改以下内容

void *calcAvg(int *nums[]){
    int sum;
    for(int i = 0; i < size; i++){
        sum += nums[i];
    }
    average = sum / (size);
    pthread_exit(0);
}

void *calcAvg(void *arg){
    int *val_p = (int *) arg;
    int sum;
    for(int i = 0; i < size; i++){
        sum += val_p[i];
    }
    average = sum / (size);
    pthread_exit(0);
}

0
投票

'pthread_create()'的主要问题是将void指针作为其最后一个参数。您正试图向它传递一个指向整数的指针数组。在终端发出“man pthread_create”以查看您应该传递的参数类型。

你真正想做的就是将数组整数传递给线程。在C中,数组索引只是指针算法的表示法。写nums[i]&nums[0] + inums+i等同。最后一种情况是有效的,因为C中数组的名称可以用作指向数组第一个元素的指针。

void *calcAvg(int *nums[])改为void *calcAvg(void* thread_args)。然后在'calcAvg'中写int *nums = (int*)thread_args。现在你可以在该函数中使用nums,就像你已经调用calcAvg(nums)一样,实际上你已经完成了。


0
投票

pthread_create()的最后一个参数必须是(void *)类型。

查看此程序,使用线程打印随机元素的二维数组:

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

void *print(A[][10]);

int main(){
    int n=3,i,j;
    pthread_t p1;

    srand(time(NULL));
    int A[10][10],B[10][10];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            A[i][j]=(rand() % 100) + 1;
    pthread_create(&p1,NULL,print,(void*)A);
    pthread_join(p1,NULL);
    return 0;
}

void *print(A[][10]){
    int i,j,n;
    n=3;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            printf("%d ",A[i][j]);
        printf("\n");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.