对于每个单元格,我想创建一个线程,将其当前行号乘以其当前列号。问题是我不知道如何正确地取消引用矩阵并使用它。 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);
}
答案 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
。它们在所有线程之间共享。创建一个线程不会为新线程的使用创建所有全局变量的快照,它们都只是共享。在这个程序中,绝对没有办法知道给定线程在此函数中会看到x
和w
的值。
您可以通过将明确的{x, w, A}
参数结构传递给每个线程来解决此问题 - 我的意思是每个线程的不同的实例。
最后,int A[10][10]
不 int**
,并且它不会衰减为一个。要证明这一点,只需打印每个A[x][w]
的地址,然后打印每个value[x][w]
的地址。了解您的2D阵列是如何布局的。打印所有地址也可以很容易地理解valgrind抱怨的地址。