【问题标题】:pthread_create causing segmentation faultpthread_create 导致分段错误
【发布时间】:2012-06-28 17:06:31
【问题描述】:

我的程序包含以下代码。

pthread_t PThreadTable[32];

 for (i=1; i<P; i++) // Checked with P = 4 
    {
        long    i, Error;

        printf( "pthread_create %d!\n", i );
        Error = pthread_create(&PThreadTable[i], NULL, 
          (void * (*)(void *))(SlaveStart), NULL);
        if (Error != 0) 
        {
            printf("Error in pthread_create().\n");
            exit(-1);
        }
    }

 SlaveStart();

代码在调用pthread_create 时出现分段错误(通过gdbvalgrind 检查)。为什么会这样?

【问题讨论】:

  • 这通常是程序中其他地方的内存损坏的症状。请发布minimal working example,我们可以自己编译并观看崩溃。另外,请查看 第一个 valgrind 告诉您的无效内存访问——打赌它不在这里。
  • 这不是一个最小的工作示例,你可以创建一个裸的 SlaveStart。
  • 为什么要转换函数指针?如果它具有正确的类型,则不必这样做。如果它有另一种类型,你会有一个段错误:)
  • 鉴于接受的答案,我想在这种情况下我可以通过添加缺失的部分来诊断问题。但是,如果您展示了我们可以复制、粘贴、编译和观察崩溃的东西——根本不需要编辑它——你可以确信我们实际上正在查看相同的问题 你是。这种问题几乎总是与丢失的部分有关。这么多问题我都没有复现,只是因为我填错的部分不同,所以我不再费心了。

标签: c linux gcc segmentation-fault


【解决方案1】:

这是因为您在循环内重新声明了变量 i。循环内的变量正在被使用,它包含垃圾值。这就是为什么表达式&amp;PThreadTable[i] 指向了错误的地址,而您会遇到分段错误。

【讨论】:

  • 只是把它扔在那里,这就是为什么你应该总是使用-Wall编译器选项编译,或者至少在进行初始代码和/或调试时。我以这种方式捕获了许多奇怪的小物品,我想它也会捕获这个问题。
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 2012-01-05
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多