gpt4 book ai didi

c - 线程返回值与预期输出不一致

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:59 25 4
gpt4 key购买 nike

我正在从事一个项目,该项目需要与下面的程序有些类似的功能,因此我尝试创建一个更简单的程序来调试我的大型程序。我正在创建的线程正在返回与其预期输出不一致的值,但它们的返回值不是随机的。线程似乎正在从其他线程返回值,或者它们返回到的变量(“tmp”)正在更新。

预期的输出应该是...

0 1

1 2

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

struct Numbers {
int x;
int y;
};

void *go(void* param)
{
struct Numbers* nums = (struct Numbers*) param;
int sum = nums -> x + nums -> y;

return (void*) sum;
}

int main()
{
int result[2][2];
int tmp;

pthread_t thread[2][2];

int i, j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
struct Numbers nums;
nums.x = i;
nums.y = j;

pthread_create(&thread[i][j], NULL, go, &nums);
}
}

for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
pthread_join(thread[i][j], (void*) &tmp);
result[i][j] = tmp;
}
}

for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d\t", result[i][j]);
}
printf("\n");
}

return 0;
}

最佳答案

您正在传递一个变量的地址,该变量在线程开始执行后可能不存在,或者至少会被多个线程看到,或者是一个数据竞争,因为一个线程写入它而其他线程读取它。

一个通用的解决方案是动态分配线程的参数和结果,并让调用者和线程以这种方式进行通信。

例子:

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

struct threadargs {
int x;
int y;
};

struct threadresults {
int sum;
int product;
};

void* threadfunc(void* args_void) {
// Get thread args in usable type.
struct threadargs* args = args_void;
struct threadresults* results = NULL;

//Compute.
int sum = args->x + args->y;
int product = args->x * args->y;

// Return the result.
results = malloc(sizeof(*results));
results->sum = sum;
results->product = product;

free(args);
return results;
}

int main()
{
pthread_t thread[2][2];
struct threadresults* results[2][2] = {0};

int i, j;
for (i = 0;i < 2; ++i) {
for (j = 0; j < 2; ++j) {
struct threadargs* args = malloc(sizeof(*args));
args->x = i;
args->y = j;

pthread_create(&thread[i][j], NULL, threadfunc, args);
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
void* result;
pthread_join(thread[i][j], &result);
results[i][j] = result;
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
printf("sum: %d\tproduct: %d\n",
results[i][j]->sum, results[i][j]->product);
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
free(results[i][j]);
}
}

return 0;
}

关于c - 线程返回值与预期输出不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39970033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com