gpt4 book ai didi

c - POSIX 父/子线程不共享数据

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

晚上的最后一个问题。我有一个家庭作业问题,我似乎无法解决,在花了大半夜的时间后,我会在这里问。

这道题是一个程序,它计算在命令行中给定整数输入的斐波那契数列(例如,./foo.out 15,它将计算前 15 个斐波那契数列)。附加参数如下:

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 一直抛出“Control Structure going to end of non-void function”,但对于导致段错误的原因没有任何说明。和以前一样,我在最后一个小时寻找解决这个问题的问题或文章,所以如果这是一个骗局,请指出解决它的问题或文章。提前感谢任何人的帮助。

最佳答案

您的问题之一在于此行:

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[] 数组的大小。这也可能导致您崩溃。

关于c - POSIX 父/子线程不共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464118/

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