我正在按照一个例子在C:http://ramcdougal.com/threads.html中实现线程。 此示例使用的是1维数组。我需要一个动态的二维数组。
如果main()
是int **array
而不是int array[ARRAYSIZE]
,会是什么样子?
我的问题是如何将指向二维数组的指针传递给结构体。 我的想法是,我有一个大数组,每个线程只应该填充该数组的某个区域。
非常感谢!
以下是示例中的代码:
struct ThreadData {
int start, stop;
int* array;
};
void* squarer(struct ThreadData* td) {
struct ThreadData* data=(struct ThreadData*) td;
int start=data->start;
int stop=data->stop;
int* array=data->array;
int i;
for (i=start; i<stop; i++) {
array[i]=i*i;
}
return NULL;
}
int main(void) {
int array[ARRAYSIZE];
pthread_t thread[NUMTHREADS];
struct ThreadData data[NUMTHREADS];
int i;
int tasksPerThread=(ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;
for (i=0; i<NUMTHREADS; i++) {
data[i].start=i*tasksPerThread;
data[i].stop=(i+1)*tasksPerThread;
data[i].array=array;
}
/* the last thread must not go past the end of the array */
data[NUMTHREADS-1].stop=ARRAYSIZE;
/* Launch Threads */
for (i=0; i<NUMTHREADS; i++) {
pthread_create(&thread[i], NULL, squarer, &data[i]);
}
/* Wait for Threads to Finish */
for (i=0; i<NUMTHREADS; i++) {
pthread_join(thread[i], NULL);
}
/* Display Result */
for (i=0; i<ARRAYSIZE; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
答案 0 :(得分:4)
动态分配二维数组使用类似这样的东西:
int** array = malloc(sizeof(int*)*ARRAYSIZE);
这里你分配一个指向int的指针数组,现在你应该为每个指针分配内存:
for(int i = 0;i<ARRAYSIZE;i++)
array[i] = malloc(sizeof(int)*INNER_ARRAYSIZE);
现在用实际数据填写每个条目:
for(int i = 0;i<ARRAYSIZE;i++)
for(int j = 0;j<INNER_ARRAYSIZE;j++)
array[i][j]=(i+j);//just for example
并更新ThreadData结构以使用二维数组:
struct ThreadData {
int start, stop;
int** twoDimArray;//note one more * here
};
只需将指针传递到这里:
struct ThreadData data;
data.twoDimArray = array;
data.twoDimArray[0][0] = data.twoDimArray[0][0]*data.twoDimArray[0][0]; //access element at 0,0 and square it
答案 1 :(得分:1)
这样想:
使用一维数组时,start
和stop
是表示1-D空间坐标的一维向量(并且1-D向量可以用整数表示,这是什么原始代码使用。)
因此,在二维数组中,start
和stop
应该是二维向量:
struct ThreadData
{
int start[2], stop[2];
int **array;
}
然后,在线程之间拆分矩形块。每个线程在start
中获取其块左上角的位置,并在stop
中获取其块右下角的位置。
请记住,矩形块可以是高条带(每个线程1列),也可以是长(每个线程一行),或正方形,或两者之间的任何位置。您必须通过基准测试来确定哪种形状更快。
从某种意义上说,tasksPerThread
也有两个维度。实际的任务数量变为tasksPerThread[0] * tasksPerThread[1]
。