【问题标题】:pthread_join receiving results from function in a arraypthread_join 从数组中的函数接收结果
【发布时间】:2013-01-16 19:32:15
【问题描述】:

我正在使用 C 语言中的 pthreads 并且遇到了问题(再次)。 我正在尝试将结果作为函数数组发送到我的主线程。

此代码查找每个工人(1 个工人/行)的最大值并保存该值的索引。到目前为止,一切都很好。 我将在此功能下方解释我的问题。这段代码做我想要的。

for (i = first; i <= last; i++){
    for (j = 0; j < size; j++){
    total += matrix[i][j];
        if(matrix[i][j] > biggest){
    biggest = matrix[i][j]; 
    x=i;
    y=j;
    maxValueResult[1]=i;
    maxValueResult[2]=j;
    }else if(matrix[i][j] < smallest){  
    smallest = matrix[i][j];
            indexes[2]=i;
            indexes[3]=j;   
}
} 
}      
    maxValueResult[0]=biggest;
    maxValueResult[1]=x;
    maxValueResult[2]=y;
printf("Results: maxValue: %d cord[%d,%d]\n",maxValueResult[0],maxValueResult[1],maxValueResult[2]);

return *maxValueResult;

我的问题是,当我在 pthread_join 中收到结果时,只有 maxValueResult[0] 有效,从 maxValueResult[1] 和 maxValueResult[2] 我只能得到地址或其他东西。 之前:“返回*maxValueResult;”所有三个值都是正确的,看起来像这样:“Results: maxValue: 95 cord[3,3]”

这里是我调用 pthread_join 的地方:

for(l=0;l<numWorkers;l++){
pthread_join(workerid[l], &maxValue);
temp[l] = maxValue[0];
if(maxValue[0]<temp[1]){
    maxValue[0] = temp[1];
    xCORD = maxValue[1];
    yCORD = maxValue[2];
}
}
printf("Results: maxValue: %d cord[%d,%d]\n",maxValue[0],xCORD,yCORD);

打印如下: “结果:maxValue:95 条 [0,1629976061]”,其中 95 是正确的,但其他两个不正确。 我能做些什么来解决这个问题? 正如您可能从我的代码中看到的那样,我不是很有经验。

编辑:我忘了告诉警告,我得到了几个!不幸的是,它们是瑞典语,但我还是把它们贴在这里: "$ gcc -o sumb matrixSumB.c matrixSumB.c: 在 funkcion "main" 中: matrixSumB.c:120:1:警告:从不兼容的指针类型传递“pthread_join”的参数 2 /usr/include/pthread.h:144:5:注意:预期为“void **”,但参数类型为“int * (*)[3]” matrixSumB.c:在函数“Worker”中: matrixSumB.c:172:1:警告:return 从整数中生成指针而无需强制转换。 "

狮子座

【问题讨论】:

  • 你在哪里创建 maxValueResult?它是线程内的自动变量吗?线程退出时它可能会被销毁。
  • 您可能会收到问题中代码的编译警告。语句return *maxValueResult; 仅返回maxValueResult 数组中的第一个值,而不是指向该数组的指针。当然,返回指向局部变量的指针是一个很大的禁忌。
  • 我在使用它的函数的开头创建它。
  • 你是如何创建它的?通过做 malloc 还是在堆栈上?你能把那段代码贴出来吗?
  • 是的,我确实收到了警告,我编辑了我的第一篇文章并将它们添加到那里!

标签: c pthreads pthread-join


【解决方案1】:

你试过了吗

return maxValueResult[0];
return maxValueResult[1];
return maxValueResult[2];

【讨论】:

  • 我现在做了,没有任何区别。
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多