Не может быть многопоточным, но работает с циклом for или одним потоком
Я пытаюсь получить несколько потоков для выполнения параллельных вычислений на двумерном массиве. Пользователь указывает, сколько потоков он хочет в массиве 25*25 2d, если пользователь хочет 5 потоков, то каждый поток выполняет вычисление для 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
}
1 ответ
while(1){}
плохая идея Пожалуйста, предоставьте код, который действительно вызывает проблемы.
Что сказал clone()
а также waitpid()
на самом деле не для многопоточности, а для многопроцессорной. Поскольку процессы имеют отдельные области памяти, это не может работать. Пожалуйста, ознакомьтесь с любым руководством по pthread, чтобы начать работу с многопоточностью.