【问题标题】:Seg Fault with argument 4 of pthread_create()pthread_create() 参数 4 的 Seg Fault
【发布时间】:2011-10-26 20:34:24
【问题描述】:

当我尝试运行此代码时,我收到了分段错误(核心转储)的错误消息。 注意:这是一个非常长的程序(将近 600 行),所以我只发布了我“认为”相关的程序。让我知道是否需要更多?在此先感谢:)

#define CONSTANT 4

int main()
{
  pthread_t tid[CONSTANT];
  int i, check;
  for( i = 0; i < CONSTANT; i++ )
  {
     check = pthread_create( &tid[i], NULL, tFunction, (void *) CONSTANT );
  }
}

void * tFunction ( void * param )
{
  int num = * (int *) param;  /* Seg fault line */
}

【问题讨论】:

    标签: c pthreads


    【解决方案1】:

    如果您要将常量转换为void * 并将其作为上下文参数传入,则需要在另一端进行互补操作:

    int num = (intptr_t)param;
    

    应该为你做。您当前的程序有一个额外的取消引用,最终会执行以下操作:

    int num = *(int *)4;
    

    这就是你的程序现在崩溃的原因。

    【讨论】:

    • 警告:从指针转换为不同大小的整数。是我从中得到的。我怎样才能摆脱警告?
    • @Dino55 - int 与您平台上的指针大小不同。我已经用来自stdint.h 的C99 intptr_t 类型更新了我的答案。如果这不起作用,您可以使用long
    【解决方案2】:

    你正在做的是:

    check = pthread_create( &amp;tid[i], NULL, tFunction,(void *) 4);

    并将第四个参数视为int *,显然不是。当您取消引用tFunction 中的地址 4 时,您会得到一个段错误。

    如果你想传递一个指向值为4的int的指针,传递一个int变量的地址,即:

    #include <pthread.h>
    
    #define CONSTANT 4
    
    void * tFunction ( void * param )
    {
      int num = * (int *) param;  /* Seg fault line */
    }
    
    int main(void)
    {
      int arg = CONSTANT;
      pthread_t tid[CONSTANT];
      int i, check;
      for( i = 0; i < CONSTANT; i++ )
      {
         check = pthread_create( &tid[i], NULL, tFunction, (void *) &arg );
      }
    
      return 0;
    }
    

    编辑pthread_join 将很有用,这样您就可以在退出程序之前等待线程终止。

    EDIT2:如果您还没有阅读 cmets:您应该确保如果您传递了一个局部变量(如本示例所示,该示例旨在显示对他的代码进行非常小的更改以获得它工作)任何新线程在变量超出范围之前完成,使用pthread_join,或为堆上的变量动态分配内存。

    【讨论】:

    • 请注意,根据调用函数的生命周期,将指针传递给局部变量可能会很危险。
    • 是的,只是在这个例子中没有任何区别。
    • 哦,是的!这就是我正在做的 :) 我到处玩,却忘了在我的代码中将其改回哈哈。无论如何,这给了我一个错误:需要左值作为一元操作数。有什么想法吗?
    • @Dino55,你在尝试做&amp;CONSTANT吗?那是行不通的。完全使用@AusCBloke 的例子,你应该没问题。
    • @Dino55 它应该与&lt;pthread.h&gt; 标头一起编译:gcc -pthread -o ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多