在线程中调用getpid的困惑
在线程的执行函数中调用getpid得到的什么值啊?应该不是所在进程的进程号吧,主线程中和create的线程中得到的不一致啊。如:
- #include <stdio.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <pthread.h>
- void * thread(void * a);
- int main(int argc,char *argv[])
- {
- pid_t ident;
- ident=getpid();
- printf("ident:%d\n",ident);
- pthread_t id;
- pthread_create(&id,NULL,thread,NULL);
- }
- void * thread(void * a)
- {
- pid_t ident;
- ident=getpid();
- printf("ident in thread:%d\n",ident);
- }
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
复制代码
??
我的结果:
[root@ibmx1 ipv6]# ./a.out
ident:16398
ident in thread:16400
很奇怪了.你用的是什么版本的Linux? 第一次见到这中情况。
理论上getpid 实现在Linux内核中非常简单的..
return currend->tgid; 其他线程和主线程都拥有同样的tgid.
我也挺奇怪,版本是2.4.20-8
在网上找了这么一段,不知道说的是否有道理:
Linux 内核并不支持真正意义上的线程,LinuxThreads是用与普通进程具有同样内核调度视图的轻量级进程来实现线程支持的。这些轻量级进程拥有独立的进程id,在进程调度、信号处理、IO等方面享有与普通进程一样的能力。在源码阅读者看来,就是Linux内核的clone()没有实现对 CLONE_PID参数的支持。
http://xx.5i2.net/n/2005-9/2005910125010.shtml
换个版本吧.我的2.6.14的.实现不同 也是非常有可能的。
NPTL 和 LinuxThreads 的行为方式不同。NPTL 在内核中给每个进程结构体添加了专门的 tid 标识符表示线程 id,同时一个进程中的线程共享一个进程号。
也就是说,linuxthreads为每个线程都分配了一个进程号吗?
Linux 中实际上没有实现真正意义上的线程.无论是进程还是线程 在创建的时候都调用clone.这是对非内核编程人员透明的.创建线程的时候 传给clone的参数 为CLONE_THREAD. 这样就把子进程(线程)插入到父进程的线程组.设置子进程(线程)的tgid=父进程的tgid...
不知道在楼主的系统.Linux是如何实现的..