2

Я пытаюсь получить несколько потоков для выполнения параллельных вычислений в 2D-массиве. Пользователь указывает, сколько потоков они хотят, поэтому в массиве 25 * 25 2d, если пользователь хочет 5 потоков, тогда каждый поток выполняет вычисления на 125 элементах. (для простоты я жестко закодировал эти цифры, чтобы попытаться заставить программу работать в этих условиях).Не удается многопоточно, но работает с циклом for или одним потоком

Код работает для 1 потока, и когда я смоделирован с циклом for, все работает правильно. Это игра в жанре конюшен в жизни. С 1 потоком или вызовом функции вызова forloop 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

while(1){} - плохая идея. Укажите код, который действительно вызывает проблемы.

Это говорит о том, что clone() и waitpid() не предназначены для многопоточности, но для многопроцессорной обработки. Поскольку процессы имеют отдельные пространства памяти, это не сработает. Ознакомьтесь с любым учебным пособием по pthread, чтобы начать работу с многопоточности.