将结果数组传递到 pthread_join

Passing a result array into pthread_join

我有以下代码,但我不明白为什么结果打印不正确。我将 val 分配为我想要获取的结果数量的大小。我将要保存结果的位置地址传递到 val 中。

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

void* roll_dice() {
    int value = (rand() % 6) + 1;
    int* result = malloc(sizeof(int));
    *result = value;
    // printf("%d\n", value);
    printf("Thread result: %p\n", result);
    return (void*) result;
}

int main(int argc, char* argv[]) {
    int NUM_DICE = 4;
    srand(time(NULL));

    pthread_t th[NUM_DICE];

    for (int i  = 0; i < NUM_DICE; i++) {
        if (pthread_create(&(th[i]), NULL, &roll_dice, NULL) == -1) {
            perror("failure");
        }
    }

    int* val = calloc(NUM_DICE, sizeof(int)); 
    for (int i = 0; i < NUM_DICE; i++) {
        pthread_join(th[i], &val);          // this doesn't work
//      pthread_join(th[i], &(val+i));      // this doesn't work        
        printf("%d\n", *val);
    }

    for (int i = 0; i < NUM_DICE; i++) {
        printf("Dice %d rolled %d\n", i+1, *(val+i));
    }

    return 0;
}
  1. malloc returns void* 成功的话需要转成int*.

  2. pthread_create的第三个参数是void(*)(void*),不是void(*)(), 所以 roll_dice() 需要一个 void* 参数。

  3. 我们可以使用数组来存储线程 return 值。

  4. 毕竟,我们需要释放我们使用 malloc 分配的内存。

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

void* roll_dice(void*) {
    int value = (rand() % 6) + 1;
    int* result = (int*)malloc(sizeof(int));
    *result = value;
    // printf("%d\n", value);
    printf("Thread result: %p\n", result);
    return (void*) result;
}

int main(int argc, char* argv[]) {
    int NUM_DICE = 4;
    srand(time(NULL));

    pthread_t th[NUM_DICE];

    for (int i  = 0; i < NUM_DICE; i++) {
        if (pthread_create(&(th[i]), NULL, &roll_dice, NULL) == -1) {
            perror("failure");
        }
    }

    int* val[NUM_DICE];
    for (int i = 0; i < NUM_DICE; i++) {
        pthread_join(th[i], (void**)&val[i]);          // this doesn't work
//      pthread_join(th[i], &(val+i));      // this doesn't work        
        printf("%d\n", *val[i]);
    }

    for (int i = 0; i < NUM_DICE; i++) {
        printf("Dice %d rolled %d\n", i+1, *(val[i]));
    }

    for (int i = 0; i < NUM_DICE; i++) {
        free(val[i]);
    }

    return 0;
}