免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5171 | 回复: 14
打印 上一主题 下一主题

在线程中调用getpid的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-25 16:31 |只看该作者 |倒序浏览
在线程的执行函数中调用getpid得到的什么值啊?应该不是所在进程的进程号吧,主线程中和create的线程中得到的不一致啊。如:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <pthread.h>

  5. void * thread(void * a);

  6. int main(int argc,char *argv[])
  7. {
  8.         pid_t ident;
  9.         ident=getpid();
  10.         printf("ident:%d\n",ident);
  11.         pthread_t id;
  12.         pthread_create(&id,NULL,thread,NULL);
  13. }

  14. void * thread(void * a)
  15. {
  16.         pid_t ident;
  17.         ident=getpid();
  18.         printf("ident in thread:%d\n",ident);
  19. }

复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-11-25 18:13 |只看该作者
  1. [root@Firewall tmp]# more 009.c
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <pthread.h>

  6. void * thread(void * a);

  7. int main(int argc,char *argv[])
  8. {
  9.         pid_t ident;
  10.         ident=getpid();
  11.         printf("ident:%d\n",ident);
  12.         pthread_t id;
  13.         pthread_create(&id,NULL,thread,NULL);
  14.         pthread_join(id,NULL);
  15.         return 0;
  16. }

  17. void * thread(void * a)
  18. {
  19.         pid_t ident;
  20.         ident=getpid();
  21.         printf("ident in thread:%d\n",ident);
  22.         return NULL;
  23. }
  24. [root@Firewall tmp]# ./009
  25. ident:25924
  26. ident in thread:25924
复制代码

论坛徽章:
0
3 [报告]
发表于 2005-11-25 19:02 |只看该作者

回复 2楼 mq110 的帖子

??
我的结果:
[root@ibmx1 ipv6]# ./a.out
ident:16398
ident in thread:16400

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-11-25 19:08 |只看该作者
原帖由 datou123654789 于 2005-11-25 19:02 发表
??
我的结果:
[root@ibmx1 ipv6]# ./a.out
ident:16398
ident in thread:16400


很奇怪了.你用的是什么版本的Linux? 第一次见到这中情况。
理论上getpid 实现在Linux内核中非常简单的..

return currend->tgid; 其他线程和主线程都拥有同样的tgid.

论坛徽章:
0
5 [报告]
发表于 2005-11-25 19:16 |只看该作者
原帖由 mq110 于 2005-11-25 19:08 发表


很奇怪了.你用的是什么版本的Linux? 第一次见到这中情况。
理论上getpid 实现在Linux内核中非常简单的..

return currend->tgid; 其他线程和主线程都拥有同样的tgid.


我也挺奇怪,版本是2.4.20-8

论坛徽章:
0
6 [报告]
发表于 2005-11-25 19:57 |只看该作者
原帖由 mq110 于 2005-11-25 19:08 发表


很奇怪了.你用的是什么版本的Linux? 第一次见到这中情况。
理论上getpid 实现在Linux内核中非常简单的..

return currend->tgid; 其他线程和主线程都拥有同样的tgid.


在网上找了这么一段,不知道说的是否有道理:

Linux 内核并不支持真正意义上的线程,LinuxThreads是用与普通进程具有同样内核调度视图的轻量级进程来实现线程支持的。这些轻量级进程拥有独立的进程id,在进程调度、信号处理、IO等方面享有与普通进程一样的能力。在源码阅读者看来,就是Linux内核的clone()没有实现对 CLONE_PID参数的支持。

http://xx.5i2.net/n/2005-9/2005910125010.shtml

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2005-11-25 20:22 |只看该作者
原帖由 datou123654789 于 2005-11-25 19:57 发表


在网上找了这么一段,不知道说的是否有道理:

Linux 内核并不支持真正意义上的线程,LinuxThreads是用与普通进程具有同样内核调度视图的轻量级进程来实现线程支持的。这些轻量级进程拥有独立的进程id,在进 ...


换个版本吧.我的2.6.14的.实现不同 也是非常有可能的。

论坛徽章:
0
8 [报告]
发表于 2005-11-26 09:19 |只看该作者
NPTL 和 LinuxThreads 的行为方式不同。NPTL 在内核中给每个进程结构体添加了专门的 tid 标识符表示线程 id,同时一个进程中的线程共享一个进程号。

论坛徽章:
0
9 [报告]
发表于 2005-11-26 22:42 |只看该作者
原帖由 wolf0403 于 2005-11-26 09:19 发表
NPTL 和 LinuxThreads 的行为方式不同。NPTL 在内核中给每个进程结构体添加了专门的 tid 标识符表示线程 id,同时一个进程中的线程共享一个进程号。


也就是说,linuxthreads为每个线程都分配了一个进程号吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-11-27 08:01 |只看该作者
原帖由 datou123654789 于 2005-11-26 22:42 发表


也就是说,linuxthreads为每个线程都分配了一个进程号吗?


Linux 中实际上没有实现真正意义上的线程.无论是进程还是线程 在创建的时候都调用clone.这是对非内核编程人员透明的.创建线程的时候 传给clone的参数 为CLONE_THREAD. 这样就把子进程(线程)插入到父进程的线程组.设置子进程(线程)的tgid=父进程的tgid...
不知道在楼主的系统.Linux是如何实现的..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP