在线程中调用getpid的困惑

发布于 2022-09-30 08:07:45 字数 969 浏览 18 评论 0

在线程的执行函数中调用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. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

多像笑话 2022-10-07 08:07:45
  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

复制代码

走野 2022-10-07 08:07:45

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

撩心不撩汉 2022-10-07 08:07:45

原帖由 datou123654789 于 2005-11-25 19:02 发表
??
我的结果:
[root@ibmx1 ipv6]# ./a.out
ident:16398
ident in thread:16400

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

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

眼泪也成诗 2022-10-07 08:07:45

原帖由 mq110 于 2005-11-25 19:08 发表

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

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

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

凉薄对峙 2022-10-07 08:07:45

原帖由 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

挽清梦 2022-10-07 08:07:45

原帖由 datou123654789 于 2005-11-25 19:57 发表

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

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

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

豆芽 2022-10-07 08:07:45

NPTL 和 LinuxThreads 的行为方式不同。NPTL 在内核中给每个进程结构体添加了专门的 tid 标识符表示线程 id,同时一个进程中的线程共享一个进程号。

故事灯 2022-10-07 08:07:45

原帖由 wolf0403 于 2005-11-26 09:19 发表
NPTL 和 LinuxThreads 的行为方式不同。NPTL 在内核中给每个进程结构体添加了专门的 tid 标识符表示线程 id,同时一个进程中的线程共享一个进程号。

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

九厘米的零° 2022-10-07 08:07:45

原帖由 datou123654789 于 2005-11-26 22:42 发表

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文