0

私のCの知識は若いので、許してください:) 本当に2つの質問、

  1. pthread_t *threadsArray次のコードを、 ではなくを正しく利用するコードに変換するにはどうすればよいthreadsArray[MAXCON]ですか?

  2. 正当な理由はありますか?明示的な配列の使用を避け、可能な場合はポインター定義の配列を使用するようにすべきだと聞いたことがあります。

pthread_t threadsArray[MAXCON];

int k;
for (k = 0; k < MAXCON; k++) {
    fprintf(stderr, "Make %d\n", k);

    int *connfd = malloc(sizeof(int));
    *connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen);
    if (*connfd == -1) {
        perror("Unable to accept connection");
        return 1;
    }

    fprintf(stderr, "Waited\n");

    pthread_t thread;
    pthread_create(&thread, NULL, readWriteToClient, connfd);
    threadsArray[k] = thread;
}

for(k = 0; k < MAXCON; k++){
    fprintf(stderr,"Join %d\n",k);
    pthread_t thread = threadsArray[k];
    pthread_join(thread, NULL);
}
4

2 に答える 2

0

スタックからのメモリではなく、動的に割り当てられたメモリ(つまり、ヒープからのメモリ)を配列に使用したいとします。これは通常、配列の存続期間を包含関数よりも長くしたい場合、またはコンパイル時に配列のサイズがわからない場合に役立ちます。

そのためには、最初の行を次のように置き換えてコードを変更する必要があります。

pthread_t *threadsArray;
threadsArray = (pthread_t*)malloc(MAXCON * sizeof(pthread_t));
// malloc may fails and return NULL, you must check this error condition
// and handle it properly (aborting the program, using a smaller array, ...)

そして、アレイの使用を終えたら、次のコマンドでメモリを解放する必要があります。

free(threadArray);
threadArray = NULL;
于 2013-01-24T12:07:00.863 に答える
0

最初に2番目の質問に答えるには、スタックとヒープの割り当ての違いについて話しているようです。

あなたが行ったように関数本体で配列を宣言すると、スタック上のスペースを占有しますが、これはかなり制限される可能性があります(数キロバイトから数メガバイト)。

これに代わる方法は、「ヒープ」にアレイを割り当てることです。これは、コンピュータで使用可能なメモリによってのみ制限されます。ヒープにメモリを割り当てるには、を使用しますmalloc()

したがって、最初の行を次のように変更します。

pthread_t *threadsArray = malloc(MAXCON * sizeof(pthread_t));

(システムのmallocが失敗する可能性がある場合は、NULLをチェックする可能性があります)

ヒープに配列を割り当てるために必要なのはこれだけです。

free(threadsArray)また、メモリを解放するために後で行う必要があります。

ただし、MAXCONが小さい場合は、これまでと同じようにスタックにアレイを割り当てることで問題ありません。

于 2013-01-24T12:07:45.283 に答える