晚上的最后一个问题。我有一个我似乎无法解决的功课问题,在花了一整晚的时间后,我会在这里问。
问题是计算Fibonacci序列的程序,在命令行给出一个整数输入(例如./foo.out 15,它将计算前15个Fibonacci数)。附加参数如下:
1。)它必须使用两个POSIX线程,一个父线程和一个子线程。 2.)它必须在它们之间共享数据(数组)。
目前,当程序控制传递回父线程时,该函数正在中断。我得到的只是一个完全没有描述性的段错误。如下所示,我可以在每次可能的控制变化时输出。
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
void *fibonacci(void *param, int numbers[]);
void *runner(void *param);
int main(int argc, char *argv[])
{
pthread_t tid;
pthread_attr_t attr;
if ( argc != 2)
{
fprintf(stderr, "Usage: 426.out <integer value> \n");
return -1;
}
if (atoi(argv[1]) < 0)
{
fprintf(stderr, "Argument must be non-negative\n");
return -2;
}
pthread_attr_init(&attr);
pthread_create(&tid, &attr, runner, argv[1]);
pthread_join(tid,NULL);
return 0;
}
void *fibonacci(void *param, int numbers[])
{
int it, IT_MAX;
printf("Entering Child Thread:\n");
IT_MAX = atoi(param);
numbers[0] = 0;
numbers[1] = 1;
for (it = 2; it < IT_MAX; ++it)
{
numbers[it] = (numbers[it - 1] + numbers[it - 2]);
}
for (it = 0; it < IT_MAX; ++it)
{
printf("%d\n", numbers[it]);
}
printf("Exiting Child Function.\n");
}
void *runner(void *param)
{
int it, IT_MAX;
int numbers[IT_MAX];
pthread_t tid;
pthread_attr_t attr;
printf("Entering Parent Thread:\n");
pthread_attr_init(&attr);
pthread_create(&tid, &attr, fibonacci(param, numbers), NULL);
pthread_join(tid, NULL);
IT_MAX = atoi(param);
for (it = 0; it < IT_MAX; it++)
{
printf("%d\n", numbers[it]); // I suspect the program breaks here
// It produces a segfault rather than this
}
printf("Leaving Parent Thread\n");
}
我所遇到的问题,如果从上面不清楚,那就是我做错了什么。我使用的是gcc,并且一直在使用-Wall
-Werror
和-lpthread
。 -Werror
继续抛出“控制结构将结束非空函数”,但没有任何关于可能导致段错误的内容。和以前一样,我在最后一小时寻找解决此问题的问题或文章,所以如果这是一个骗局,请指出我的问题或文章。感谢任何人提前帮助他们。
答案 0 :(得分:3)
你的一个问题就在于这一行:
pthread_create(&tid, &attr, fibonacci(param, numbers), NULL);
而不是使用fibonacci()
函数启动一个线程,此调用当前线程中的fibbonacci()
函数,并将结果作为线程传递给pthread_create()
启动功能。 fibonacci()
不返回函数指针,因此这个新线程会使程序崩溃。
您只需将fibonacci
作为第三个参数传递。
此外,fibonacci()
必须声明为void *fibonacci(void *)
才能用作线程启动功能。如果要传递两个参数,则需要将它们放入struct
并传递指针。
这对线也存在问题:
int it, IT_MAX;
int numbers[IT_MAX];
IT_MAX
是一个未初始化的变量,您可以在此处使用它来定义numbers[]
数组的大小。这也可能导致你的崩溃。
答案 1 :(得分:1)
这一行
pthread_create(&tid, &attr, fibonacci(param, numbers), NULL);
未将fibonacci()
的地址传递给pthread_create()
,但会调用fibonacci(param, numbers)
并将返回的结果作为第3个参数传递给pthread_create()
。