我正在尝试构建自己的uclibc嵌入式系统。我遇到了一些问题,但两天后,我解决了所有的问题。只剩下一个: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;
}
在我的基于GLIMC的系统中,它运行并退出。
但在基于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,现在它工作了。
最佳答案
如果您没有通过其他方式确保主线程是最后一个运行的线程,main
需要在返回之前调用pthread_exit()
,以等待所有其他线程终止。
如果没有其他线程在运行,那就变成了一个no-op,所以无论如何调用它都没有坏处。