【问题标题】:Is there a way to pass a 2D array into a pthreads function?有没有办法将二维数组传递给 pthreads 函数?
【发布时间】:2019-10-29 07:13:56
【问题描述】:

我正在尝试理解 pthreads,我正在研究这个项目,我必须通过 pthreads 将二维数组传递给稍后会对数组进行一些处理的函数。

我试图用 struct 传递它,但我很困惑。

#define rows 5
#define colums 5


void *maxthread(void *size )
{   
    int (*array)[rows][colums]
    ....
    ...
}



int main ()
{   
    
    int array[rows][colums];
    int p,P;
    pthread_t *thread;
    int i,j,r,c;
     
    
        printf("\n give numbers to array :\n");
     for(i=0;i< grammes;i++)
        {
        for(j=0;j< stiles;j++)
        {
            printf("element [%d,%d] : ",i+1,j+1);
            scanf("%d",&array[i][j]);
        }
    }
 
    printf("\n matrix result :\n");
    for(i=0;i< rows;i++)
    {
        for(j=0;j< colums;j++)
        {
            printf("%d\t",array[i][j]);
        }
        printf("\n");   
    }
    
    printf("give number of threads\n");
    scanf("%d",&p);
    for(i=0;i<p;i++)
    P=pthread_create(&thread[i][i],NULL,maxthread,(void *));
    
    return 0;

我希望在数组中找到最大的数,但首先我必须通过 pthread 传递数组。

【问题讨论】:

  • 这段代码对我来说没有多大意义。您有一个未分配的 thread * 指针,并且正在使用 &amp;thread[i][i] 对其进行索引并尝试创建一个线程。你在这里的意图是什么?你想要一个二维的线程数组吗?感谢您的澄清。
  • 我只是在尝试!我想要实现的主要目标是通过 pthread 将用户创建的数组传递给函数

标签: arrays c pointers multidimensional-array pthreads


【解决方案1】:

很好的尝试;但是,我建议采取小步骤并经常编译,以避免让自己陷入太深的混乱状态。看到错误后,请立即修复它,然后再继续。

鉴于您的用例(用户定义的输入),我建议使用动态内存分配。这样,用户可以指定任意大小的矩阵(以及任意数量的线程)。其次,由于线程只接受一个参数,将矩阵属性封装在一个结构中似乎是理想的。应该有一个指向数据的指针字段以及用于行和列的记录,所有这些都可以使用(或多或少)您当前的输入代码由用户指定。

在将参数结构传递给工作函数后,您需要将其转换为正确的类型。在这里修改共享数据要小心!如果多个线程要同时尝试修改矩阵结构,您可以向矩阵结构添加互斥锁或信号量。

这是一个概念证明:

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

typedef struct matrix {
    int rows;
    int cols;
    int **data;
} matrix;

void *maxthread(void *arg) {   
    matrix m = *((matrix *)arg);

    for (int i = 0; i < m.rows; i++) {
        for (int j = 0; j < m.cols; j++) {
            printf("[%2d]", m.data[i][j]);
        }

        puts("");
    }

    puts("");
    return NULL;
}

int main() {   
    int num_threads = 3; // or take user input
    pthread_t threads[num_threads];
    matrix m;
    m.rows = 11;         // or take user input
    m.cols = 8;
    m.data = malloc(sizeof(int *) * m.rows);

    for (int i = 0; i < m.rows; i++) {
        m.data[i] = malloc(sizeof(int) * m.cols);

        for (int j = 0; j < m.cols; j++) {
            m.data[i][j] = i * j;
        }
    }

    for (int i = 0; i < num_threads; i++) {
        pthread_t thread;
        pthread_create(&thread, NULL, maxthread, &m);
        threads[i] = thread;
    }

    for (int i = 0; i < num_threads; i++) {
        pthread_join(threads[i], NULL);
    }

    for (int i = 0; i < m.rows; i++) {
        free(m.data[i]);
    }

    free(m.data);
    return 0;
}

输出可能类似于:

[ 0][ 0][ 0][ 0][ 0][ 0][ 0][ 0]
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7]
[ 0][ 2][ 4][ 6][ 8][10][12][14]
[ 0][ 3][ 6][ 9][12][15][18][21]
[ 0][ 4][ 8][12][16][20][24][28]
[ 0][ 5][10][15][20][25][30][35]
[ 0][ 6][12][18][24][30][36][42]
[ 0][ 7][14][21][28][35][42][49]
[ 0][ 8][16][24][32][40][48][56]
[ 0][ 9][18][27][36][45][54][63]
[ 0][10][20][30][40][50][60][70]

[ 0][ 0][ 0][ 0][ 0][ 0][ 0][ 0]
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7]
[ 0][ 2][ 4][ 6][ 8][10][12][14]
[ 0][ 3][ 6][ 9][12][15][18][21]
[ 0][ 4][ 8][12][16][20][24][28]
[ 0][ 5][10][15][20][25][30][35]
[ 0][ 6][12][18][24][30][36][42]
[ 0][ 7][14][21][28][35][42][49]
[ 0][ 8][16][24][32][40][48][56]
[ 0][ 9][18][27][36][45][54][63]
[ 0][10][20][30][40][50][60][70]

[ 0][ 0][ 0][ 0][ 0][ 0][ 0][ 0]
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7]
[ 0][ 2][ 4][ 6][ 8][10][12][14]
[ 0][ 3][ 6][ 9][12][15][18][21]
[ 0][ 4][ 8][12][16][20][24][28]
[ 0][ 5][10][15][20][25][30][35]
[ 0][ 6][12][18][24][30][36][42]
[ 0][ 7][14][21][28][35][42][49]
[ 0][ 8][16][24][32][40][48][56]
[ 0][ 9][18][27][36][45][54][63]
[ 0][10][20][30][40][50][60][70]

【讨论】:

  • 感谢您的帮助!请问你写这行的目的是什么:m.data[i] = malloc(sizeof(int) * m.cols);
  • 查看overview of dynamic memory in Cint ** 是指向整数数组的指针。所以我们需要为外部数组分配内存,也就是整数指针的大小乘以行数,那么对于每一行,我们需要为一个整数大小乘以列数的数组分配内存行。首先尝试分配一维数组,然后升级到二维。
猜你喜欢
  • 2021-06-22
  • 2020-11-01
相关资源
最近更新 更多