2

ここでの私の目標は、100 万個のプロセスとスレッドを (順次) 作成した場合のパフォーマンスを単純に比較することです。各プロセス/スレッドは何もせず、現在のプロセスが終了した後にのみ実行する必要があります。

以下は私のコードです。コンパイルすると、エラーのインスタンスがいくつか発生します。

-bash: fork: retry: Resource temporarily unavailable

何が起こっている?

これが私のコードです:

int main(int argc, char* argv[]){

int numberOfActions = 0;
int i;

if(argc != 3){
    printf("usage: <thread/process> <number_of_threads/processes>\n");
    exit(1);
}

numberOfActions = atoi(argv[2]); //number of threads/processes
if(strcmp(argv[1], "p") == 0){
    printf("process\n");
    int pid;
    int status;
    for(i = 0; i < numberOfActions; i++){
        pid = fork();

        if(pid < 0){//fork failed
            printf("fork failed\n");
            exit(0);
        }
        else{//fork succeeded
            if(pid == 0){//child
                continue;
            }
            else{//parent
                waitpid(pid, &status, WUNTRACED);
                exit(0);
            }
            exit(0);
        }
    }
}
else{
    printf("thread\n");
    pthread_t tidp;
    int thread0;
    int parameter = 0;
    for(i = 0; i < numberOfActions; i++){
        thread0 = pthread_create(&tidp, NULL, &continueThread, (void*) &parameter);
        if(thread0 != 0) printf("\ncan't create thread\n");
        pthread_join(tidp, NULL);
    }
}

return 1;

}
4

1 に答える 1

6

コードでは、各子がすぐに別の子を作成します。したがって、プロセスを連続して実行していません。各親は、その子が終了するまで終了しないため、実際には、同時に 100 万のプロセスを作成しようとしています。

代わりに、次のようなことができます。

for(i = 0; i < numberOfActions; i++){
    pid = fork();

    if(pid < 0){//fork failed
        printf("fork failed\n");
        exit(0);
    }
    else{//fork succeeded
        if(pid == 0){//child
            exit(0);
        }
        else{//parent
            waitpid(pid, &status, WUNTRACED);
        }
    }
}
于 2013-04-22T23:26:20.197 に答える