线程创建时非常奇怪,这里是测试代码:
30214 root 704 S ./test
30215 root 704 S ./test
30216 root 704 S ./test
该代码在ps命令上生成以下输出(在./test&启动之后):
{{1}}
任何提示?
答案 0 :(得分:4)
请注意。 man 7 pthreads
的LinuxThreads
此实现的显着特征如下:
- 除了主(初始)线程和线程之外 程序使用
pthread_create(3)
创建实现 创建一个"经理"线。该线程处理线程创建 和终止。 (如果此线程是,则可能导致问题 不经意间被杀了。)- 线程不共享进程ID。 (实际上,LinuxThreads 线程被实现为共享更多信息的进程 比平常,但不共享一个共同的进程ID。) LinuxThreads线程(包括管理器线程)可见为 使用
ps(1)
单独处理。
无论这个doc是关于Glibc的,你的版本uClibc可能会使用LinuxThreads作为pthread"后端"。因此,从技术上讲,您的代码可能会创建三个调度实体。
但首先,您必须确保 ps
打印线程,而不仅仅是进程并仔细检查在探测过程中是否只有一个已启动的程序实例。
P.S。另外你应该检查你的uClibc是否真的使用LinuxThreads而不是NPTL。所以IMO有机会观察三个线程,但它很小。
答案 1 :(得分:2)
ps
向您显示流程,而非线程。
可能您只使用./test &
使用以下方法测试它会终止所有进程:killall test
请重新开始您的流程并查看输出:ps -A | grep test
它会显示1个test
然后使用:ps -eLf | grep test
您会看到test
的帖子。
修改强>
与@Serhio的答案相关,这可能是正确的,查看this link的uClibc源代码,你可以在libpthread目录中找到使用的LinuxThreads,因此添加了一个线程管理器。
答案 2 :(得分:0)
是的......对(@Serhio和@LPs)...我的uClibc使用我刚刚检查过的经理。
不幸的是,由于tyny linux嵌入式环境,我的ps非常差。