【问题标题】:POSIX parent/child threads not sharing dataPOSIX 父/子线程不共享数据
【发布时间】:2023-03-20 14:00:02
【问题描述】:

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

问题是一个程序,它在命令行输入一个整数来计算斐波那契数列(例如,./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 不断抛出“控制结构将结束非空函数”,但对于导致段错误的原因没有什么可说的。和以前一样,我在最后一小时寻找解决这个问题的问题或文章,所以如果这是一个骗局,请指出我解决它的问题或文章。提前感谢任何人的帮助。

【问题讨论】:

    标签: c multithreading posix


    【解决方案1】:

    你的一个问题是在这一行:

    pthread_create(&tid, &attr, fibonacci(param, numbers), NULL);
    

    调用当前线程中的fibbonacci() 函数,而不是使用fibonacci() 函数启动线程,并将结果作为线程启动函数传递给pthread_create()fibonacci() 不返回函数指针,所以这个新线程会使程序崩溃。

    您只需将fibonacci 作为第三个参数传递。

    此外,fibonacci() 必须声明为void *fibonacci(void *) 才能用作线程启动函数。如果您想传递两个参数,您需要将它们放入 struct 并传递一个指向它的指针。

    这对线也有问题:

    int it, IT_MAX;
    int numbers[IT_MAX];
    

    IT_MAX 是一个未初始化的变量,您在这里使用它来定义numbers[] 数组的大小。这也可能导致您的崩溃。

    【讨论】:

      【解决方案2】:

      这一行

      pthread_create(&tid, &attr, fibonacci(param, numbers), NULL);
      

      不将fibonacci()的地址传递给pthread_create(),而是调用fibonacci(param, numbers)并将返回的结果作为第三个参数传递给pthread_create()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多