【问题标题】:main() does not terminate after successful pthread_join成功 pthread_join 后 main() 不会终止
【发布时间】:2014-06-20 13:29:01
【问题描述】:

我有一个程序启动一个 pthread,然后在它返回之前等待这个线程的终止。代码是这样的:

int main(int32_t argc, char* argv[]) {
  pthread_t t;
  /* initialization and other stuff 
     ... 
  */
  printf("join result:%d\n", pthread_join(t, 0));
  return 0;
}

程序按预期打印:join result: 0。所以加入工作和 t 完成。尽管如此,程序并没有停止执行。如果我在return 0 行之前插入命令exit(0)(或其他数字),我只能强制它停止。

但是,如果我删除带有pthread_join 调用的行,程序将完美退出。

这怎么可能?在所有子线程加入后,什么可以阻止程序完成执行?

编辑:我刚刚发现 gdb 告诉我在使用 } 执行最后一行后出现分段错误。不过我不知道幕后发生了什么:

Program received signal SIGSEGV, Segmentation fault.
0x000000060003aa10 in ?? ()

【问题讨论】:

  • 我在查看手册页时遇到了这个问题:如果多个线程同时尝试加入同一个线程,则结果未定义。如果调用 pthread_join() 的线程被取消,那么目标线程将保持可连接状态(即它不会被分离)。你有没有机会做这样的事情?
  • @RobertEkendahl 但是这不会反映在printf 的消息中吗?无论哪种方式,我只有一个主线程来创建和连接其他线程。
  • 我看不出有什么明显的原因可以解释为什么会出现段错误。你能再贴一些代码吗?
  • @RobertEkendahl 我会尽量减少代码以将代码减少到最低限度,并会尽快发布。
  • 我认为主线程中可能发生堆栈损坏。从windows我知道在执行main之前,exit_process函数的地址被压入堆栈。然后 return 0 执行一个 exit_process 调用。如果在您的情况下堆栈已损坏,则指向 exit_process 的指针可能被替换为无效指针。

标签: c pthreads pthread-join


【解决方案1】:

我认为可能堆栈损坏发生在主线程中。从windows我知道在执行main之前,exit_process函数的地址被压入堆栈。然后 return 0 执行一个 exit_process 调用。如果在您的情况下堆栈已损坏,则指向 exit_process 的指针可能被替换为无效指针。

【讨论】:

    猜你喜欢
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2015-11-19
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多