Linux 2.6.30 uClibc 0.9.29 pthread_create两个胎面只有一个

时间:2016-08-02 12:52:37

标签: c linux pthreads

线程创建时非常奇怪,这里是测试代码:

30214 root        704 S   ./test
30215 root        704 S   ./test
30216 root        704 S   ./test

该代码在ps命令上生成以下输出(在./test&启动之后):

{{1}}

任何提示?

3 个答案:

答案 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 &

启动了3倍的应用

使用以下方法测试它会终止所有进程: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非常差。