【问题标题】:Returning from an array from thread in C?从C中的线程从数组返回?
【发布时间】:2013-12-05 23:22:28
【问题描述】:

我不知道我在以下函数中做错了什么。我正在尝试返回一个数组,但它在 compute_average 中的 while 循环中出现 Seg Faults。我正在使用一个结构来初始化开头和最后一个单词,并在函数“compute_average”中使用您可以假设 compute_average 函数工作正常,但我在使用结构或“first”和“second”时更改了代码价值。

typedef struct parallel{
unsigned long first, second;
}Parallel;

return final_array;

}

【问题讨论】:

  • compute_prime 被定义为 void 但有返回值。
  • 我认为这不是问题。查看第 9 页 cs.umd.edu/class/fall2013/cmsc216/lectures/Week12/…
  • @jucestain compute_prime 返回void*,这对于线程来说是很正常的
  • 不,它被定义为 void * 所以它返回一个指针。
  • 除了下面的答案之外,您意识到线程在这个实现中绝对什么都没有,对吧?

标签: c arrays pthreads sieve-of-eratosthenes


【解决方案1】:

你对pthread_join 的论点是错误的。实际上,您正在这样做:

pthread_join(tid, NULL);

您需要提供void * 变量的地址(从技术上讲,您应该捕获pthread_join 本身的返回值,以防它失败,尽管这里不会):

error = pthread_join(tid, &ary1);

如果error==0 在此之后,ary1 将包含从线程返回的值,array1 = ary1 将足以使其有用(那里不需要强制转换)。

(作为ldav1s noted,大小也是错误的。您可能希望增加代码以返回多个指针。或者您可以填写线程调用者提供的数据结构。[我正在制作各种最后在这里猜测你可能如何实现多个线程。猜测可能是错误的。:-) ])

【讨论】:

  • 现在,我明白了:***检测到 glibc *** p: free(): 下一个大小无效(快速):0x00000000025b0130 *** ***检测到 glibc *** p: free (): 无效指针: 0x00000000025b0150 ***
  • 这可能是由于在主线程中使用了错误的大小。给定当前代码,只需像在计算线程中一样使用来自 parallel 的值。
【解决方案2】:

这个:

unsigned long *array1;
...
size = (sizeof(array1)/sizeof(array1[0]));

看起来非常可疑,除非size 应该是 1 或 2。array1 是一个指针,而不是一个数组。

pthread_join(tid, ary1);

应该是:

pthread_join(tid, &ary1);

如果您想从compute_prime 取回任何数据。您还需要在从compute_prime 返回的数据中“添加”某种大小,以告诉您有多少元素。

您还泄漏了compute_prime 分配的内存,更好的是free(ary1)

【讨论】:

  • 我试过了:size = (sizeof(*array1)/sizeof(&array1[0])) 不起作用。
  • @user3022651 大小是(或至少更好last - first 来自您的parallel 结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2015-02-09
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多