Проблема разветвления процессов и создания потоков - PullRequest
1 голос
/ 17 февраля 2011

Предполагается, что моя программа разветвляется на три процесса. Каждый из этих процессов создаст три потока и разделит два дополнительных процесса. Эти два дополнительных процесса создадут три потока. Вот мой код Я пытался сделать вещи простыми с помощью вложенных циклов. Я думаю, что в какой-то момент я мог бы форкировать больше процессов или создавать больше потоков.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void *printme(void* Array){
    int *Arr = (int *) Array;
    int len = sizeof(Arr) / sizeof(int);
    if (len == 1){
        printf("I'm thread %d.%d",Arr[0],Arr[1]);
    }
    else if (len == 2){
        printf("I'm thread %d.%d.%d",Arr[0],Arr[1],Arr[2]);
    }
    printf("\n");
    pthread_exit(NULL);
}

int main(void){
    int i, j, k, l;
    int threadLevel1[2];
    int threadLevel2[3];
    printf("\n");   
    for (i = 1 ; i < 4 ; i++){ // Loop to fork the three main processes.
        if (fork() != 0){
            sleep(4);   
        }
        else{
            //The newly forked process will create three threads and fork two additional processes.

            for (j = 1 ; j < 4 ; j++){
                pthread_t t;                
                threadLevel1[0] = i;
                threadLevel1[1] = j;                
                if (pthread_create(&t, NULL, printme, (void*) threadLevel1) != 0){
                    perror("pthread_create");
                    exit(1);
                }   
            }
            for (k = 1; k < 3 ; k++){           
                pid_t a = fork();               
                if (a != 0){
                    sleep(2);

                }
                else if (a == -1){
                    perror("fork"); /* display error message */
                        exit(0); 
                }
                else{
                    for (l = 1 ; l < 4 ; l++){                          
                        pthread_t t;                    
                        threadLevel2[0] = i;
                        threadLevel2[1] = k;
                        threadLevel2[2] = l;    
                        if (pthread_create(&t, NULL, printme, (void*) threadLevel2)!=0)                                                 {
                            perror("pthread_create");
                            exit(1);                        
                        }                       
                    }   
                }
            }
        }
    }
    return 0; 
}

1 Ответ

0 голосов
/ 06 августа 2011

У вас проблема с кодом здесь:

void *printme(void* Array){
    int *Arr = (int *) Array;
    int len = sizeof(Arr) / sizeof(int);

Значение len всегда будет одинаковым, независимо от того, что передано в printme.Это потому, что C передает массивы как указатели, а не как объекты со встроенными длинами.

...