4

現在、pthreads を使用するプロジェクトに取り組んでいます。これまでのプロジェクトは、ユーザーが指定した数のスレッドを開始し、各スレッドでいくつかの作業を行ってから閉じます。各スレッドは、動的に割り当てられたメモリ配列に格納されます。私はこれを使用して行います:

threads = malloc(number_of_threads * sizeof(pthread_t));

次に、for ループで各スレッドを作成します。

pthread_create(&(threads[i]), NULL, client_pipe_run, (void *) &param[i]);

次に行う必要があるのは、これらのスレッドの戻り値を格納することです。私の理解では、戻り値を格納したいポインターのアドレスを pthread_join に渡す必要があります。ここで少し混乱します。この時点までのポインターは問題ありませんが、私の脳は一種のメルトダウンしています(笑)。これはこれを達成する方法に関する私の考えですが、これが正しいとは確信していません:

int *return_vals = malloc(sizeof(int) * number_of_threads);
for(i = 0; i< number_of_threads; i++)
{
pthread_join(&(threads[i]),(void *) &(return_vals[i]));
}

次に、戻り値を取得するには、次のようにします。

int val = *(return_val[0]);

これについての助けをいただければ幸いです。

4

1 に答える 1

6

次のようにスレッドにメモリを割り当てていることに注意してください。

threads = malloc(number_of_thread * sizeof(pthread_t));

ただし、戻り値については次のようにします。

int *return_vals = malloc(sizeof(int *));

つまり、ここでもスレッド数をカウントする必要があります。

int *return_vals = malloc(number_of_thread * sizeof(int));

void*次に、戻り値を次のようにキャストできます。

void *foo(void *arg) {
    int i = 7;
    return (void*)i;
}

int main(void) {
    int i = 0;
    int thread_count = 3;
    pthread_t* threads = malloc(thread_count * sizeof(pthread_t));
    int *return_vals = malloc(thread_count * sizeof(int));

    // create threads:
    for(i = 0; i < thread_count; ++i)
        pthread_create(&threads[i], NULL, &foo, NULL);

    // wait untill they finish their work:
    for(i = 0; i < thread_count; ++i)
        pthread_join(threads[i], (void**) &return_vals[i]);

    // print results:
    for(i = 0; i < thread_count; ++i)
        printf("Thread %d returned: %d\n", i, return_vals[i]);

    // clean up:
    free(return_vals);
    free(threads);

    return 0;
}

または、コードが返す型のサイズがそれ以下であると推定しないことを確認しsizeof(void*)、戻り値のメモリをスレッド内で動的に割り当てることができます。

void *foo(void *arg) {
    int* ret = malloc(sizeof(int));
    *ret = 7;
    return ret;
}

int main(void) {
    int i = 0;
    int thread_count = 3;
    pthread_t* threads = malloc(thread_count * sizeof(pthread_t));

    // array of pointers to return values of type int:
    int **return_vals = calloc(thread_count, sizeof(int*));

    // create threads:
    for(i = 0; i < thread_count; ++i)
        pthread_create(&threads[i], NULL, &foo, NULL);

    // wait untill they finish their work:
    for(i = 0; i < thread_count; ++i)
        pthread_join(threads[i], (void**) &return_vals[i]);

    // print results:
    for(i = 0; i < thread_count; ++i)
        printf("Thread %d returned: %d\n", i, *return_vals[i]);

    // clean up:
    for(i = 0; i < thread_count; ++i)
        free(return_vals[i]);
    free(return_vals);
    free(threads);

    return 0;
}

ただし、後者を選択した場合は、最終的に発生する可能性のあるメモリ リークに注意してください。

于 2013-03-04T19:13:47.007 に答える