我试图让多个线程在2D阵列上执行并行计算。 如果用户想要5个线程,则用户在25 * 25 2d阵列上指定他们想要多少线程,然后每个线程对125个元素执行计算。 (为简单起见,我硬编码这些数字只是为了尝试让程序在这些条件下工作)。
该代码适用于1个线程,当我使用for循环进行模拟时,一切正常。这是一个生活方式的康诺特游戏。用1个线程或forloop调用gen函数5次,程序运行正常。它可以正确地打印出网格。有5个线程,它只打印一次,程序结束
我无法在线程内部进行测试,因为printf在线程中不起作用。我花了好几个小时才完成这件事,我无法弄清楚。
int N;
int **gridA;// odd generations
int **gridB;//even
int T = 5;//number of threads
int main ( int argc, char *argv[] ){
int i,j;
const int STACK_SIZE = 65536;
char *stack;
char *stackTop[t];
pid_t cret[t], wret;
N = 25;//array size [25][25];
//initialize stack
stack = malloc(STACK_SIZE);
for(i = 0; i < T; i++){
stackTop[i] = stack + STACK_SIZE;
}
//initilize arrays and load gridA with input
while(1){}
for(i=0; i < T; i++) cret[i]=clone(generateNext, stackTop[i], CLONE_VM|SIGCHLD, (void*)i);//thread code
for(i=0; i < T; i++) waitpid(cret[i],&status,0);//wait for threads to finish
//for(i=0; i < T; i++){generateNext((void*)i);} Simulate threads, works like this
if(toggle){//grids used interchangeably.
print_array(gridA);
toggle = 0;
} else {
print_array(gridB);
toggle = 1;
}
}
}
//figures out the next generation
void generateNext(void *p){
//finds out the two points each thread will calculate for by using p
//eg first thread: gridA[0][24] to [4][24] 2nd thread: [5][25] to 9[25]
//then finds neighbours and changes state of each element accordingly
}
答案 0 :(得分:0)
while(1){}
是一个坏主意。请提供实际导致问题的代码。
那说clone()
和waitpid()
并不是多线程,而是多处理。由于进程具有单独的存储空间,因此无法工作。请查看任何pthread教程,以便开始使用多线程。