将结果数组传递到 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;
}
malloc
returns void*
成功的话需要转成int*
.
pthread_create
的第三个参数是void(*)(void*)
,不是void(*)()
,
所以 roll_dice()
需要一个 void*
参数。
我们可以使用数组来存储线程 return 值。
毕竟,我们需要释放我们使用 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;
}
我有以下代码,但我不明白为什么结果打印不正确。我将 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;
}
malloc
returnsvoid*
成功的话需要转成int*
.pthread_create
的第三个参数是void(*)(void*)
,不是void(*)()
, 所以roll_dice()
需要一个void*
参数。我们可以使用数组来存储线程 return 值。
毕竟,我们需要释放我们使用 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;
}