【问题标题】:Linux + uClibc + pthread (C) : application freezes at the endLinux + uClibc + pthread (C) : 应用程序最终冻结
【发布时间】:2011-12-04 19:24:38
【问题描述】:

我正在尝试构建自己的 uClibc 嵌入式系统。我遇到了一些问题,但2天后,我解决了所有问题。只剩下一个:pthread 无法正常工作。 这是一个简单的程序,来自 python 的配置脚本:

#include <pthread.h>

void* routine(void* p){return NULL;}

int main(){
  pthread_t p;
  if(pthread_create(&p,NULL,routine,NULL)!=0)
    return 1;
  (void)pthread_detach(p);
  return 0;
}

在我的基于 glibc 的系统上,它运行然后退出。 但在我基于 uclibc 的系统上,它运行、结束线程并冻结:

[Thread debugging using libthread_db enabled]
[New Thread 0x801 (LWP 17631)]
[New Thread 0x402 (LWP 17632)]
[Thread 0x402 (LWP 17632) exited]
[Thread 0x801 (LWP 17631) exited]
^C
Program received signal SIGINT, Interrupt.
0xb7f768e7 in sigsuspend () from /lib/libc.so.0

我尝试了旧的和新的 linuxthreads,它们都不起作用。你有什么想法吗?

编辑:

好的,我找到了更多信息:

#include <pthread.h>
#include <stdio.h>
void* routine(void* p){printf("AAA!\n");return NULL;}

int main(){
  pthread_t p;
  pthread_create(&p,NULL,&routine,NULL);
   printf("BBB!");
  (void)pthread_detach(p);
  pthread_exit(0);
  exit(0);
}

仅打印“AAA!”,然后冻结(glibc 系统以随机顺序打印“AAA!”和“BBB!”)。所以我认为uclibc pthreads本身一定有一些错误。还有其他帮助吗? 尝试了其他一些 pthread 测试,每个测试最终都冻结了。 编辑:我不知道为什么会这样,但我复制了预编译的 uclibc,它现在可以工作了。

【问题讨论】:

  • 我在 ARM cortex_A8 平台上使用 uClibc 0.9.30.2 测试了您的代码,它可以正常工作。

标签: linux pthreads uclibc


【解决方案1】:

如果你没有通过其他方式确保主线程是最后一个运行的,main需要在返回之前调用pthread_exit(),等待所有其他线程终止。

如果没有其他线程在运行,那将成为空操作,因此无论如何调用它都没有害处。

【讨论】:

  • glibc 比 uClibc 更宽松,并且会默默地修复可检测到的错误。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多