如何取消引用并使用传递给C中POSIX线程的矩阵?

时间:2018-02-14 17:32:42

标签: c multithreading concurrency

对于每个单元格,我想创建一个线程,将其当前行号乘以其当前列号。问题是我不知道如何正确地取消引用矩阵并使用它。 Valgrind说,在fillcell中使用的是未初始化的8号值。由于它的大小为8,我怀疑它是指针。我只是试图正确地转换它,并真的很感激任何帮助。谢谢你提前。

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

#include "myutils.h"
int i = 10;
int j = 10;

int var = 0;
int w,x;


void * fillcell(void * param){

    int** value = (int**) param;

    value[x][w]= x*w;

    printf("%d \n",w*x);


}


int main(int argc, char * argv[])
{
    pthread_t * tid;
    tid = malloc(i*j*sizeof(pthread_t));

    int A[i][j];

    for ( x = 0; x < i; x++){
        for( w = 0; w < j; w++){

            pthread_create(&tid[var],NULL , fillcell,&A);
            pthread_join(tid[var],NULL);  
            var++:
        }
    }

    free(tid);
}

1 个答案:

答案 0 :(得分:2)

int i = 10;
int j = 10;

int var = 0;
int w,x;

全球:只说不。

在单线程程序中它们通常不是一个好主意,但在多线程中使用可变全局变量(从未初始化开始)是有风险的。

void * fillcell(void * param) {
    int** value = (int**) param;
    value[x][w]= x*w;

您的程序只有一个变量x和一个变量w。它们在所有线程之间共享。创建一个线程不会为新线程的使用创建所有全局变量的快照,它们都只是共享。在这个程序中,绝对没有办法知道给定线程在此函数中会看到xw的值。

您可以通过将明确的{x, w, A}参数结构传递给每个线程来解决此问题 - 我的意思是每个线程的不同的实例。

最后,int A[10][10] int**,并且它不会衰减为一个。要证明这一点,只需打印每个A[x][w]的地址,然后打印每个value[x][w]的地址。了解您的2D阵列是如何布局的。打印所有地址也可以很容易地理解valgrind抱怨的地址。