关于线程的一点疑问

beyonddream2008 2009-09-24 02:07:44
在LINUX中线程就是进程,无非是几个进程共享一些资源而已。
按照APUE所说,也就是每个线程的pid都是不同的,可是我在UUNTU和FEDORA中每个线程getpid()怎么得到的都是一样的呢?
求解答。。。
...全文
148 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
iisbsd 2009-09-27
  • 打赏
  • 举报
回复
还是想确认一下,我手头没有中文版的,可不可以给出章节什么的,看看是不是原著的纰漏,或者是翻译的问题。
taifengtieren 2009-09-27
  • 打赏
  • 举报
回复
进程和线程是不一样的。进程比线程“重”。gettid( )才是获取线程号。
beyonddream2008 2009-09-27
  • 打赏
  • 举报
回复
谢了哈,就你说到点上了,不过APUE2的例程确实是输出不同的pid,可以看一下page291。。。
[Quote=引用 17 楼 zg_hover 的回复:]
posix 规定一个多线程程序必须要有一个相同的PID,但linux实现是以进程方式实现的,所以引入线程组,
一个线程组的PID是一样的,就是第一个线程的PID,他存放在tgid字段,getpid返回的是cuurent->tgid而不适pid,所以一个多线程应用程序中的所有线程共享相同的标识符。



[/Quote]
一 铭 2009-09-27
  • 打赏
  • 举报
回复
但原理应该就是那样的了
一 铭 2009-09-27
  • 打赏
  • 举报
回复
可能是不同版本的kernel实现不一样?
不知道apue2跑在什么kernel版本上,我运行过他的例子得到的pid是一样的,呵呵

看了一下2.6.10的kernel实现的getpid()的系统调用:

998 /**
999 * sys_getpid - return the thread group id of the current process
1000 *
1001 * Note, despite the name, this returns the tgid not the pid. The tgid and
1002 * the pid are identical unless CLONE_THREAD was specified on clone() in
1003 * which case the tgid is the same in all threads of the same group.
1004 *
1005 * This is SMP safe as current->tgid does not change.
1006 */
1007 asmlinkage long sys_getpid(void)
1008 {
1009 return current->tgid;
1010 }
1011

你可以再看看其他版本的kernel的实现。但原来应该就是那样的了
beyonddream2008 2009-09-27
  • 打赏
  • 举报
回复
嗯,我看了一下,知道怎么回事了,谢谢
[Quote=引用 23 楼 guosha 的回复:]
看看LinuxThread跟NPTL两种线程实现方式的不同就会明白了。如果用的是LinuxThread,不同线程的进程号会不一样,而NPTL不同线程的进程号是一样的。
[/Quote]
beyonddream2008 2009-09-27
  • 打赏
  • 举报
回复
但是APUE2给出的例程就是通过getpid()得到不同pid。。。。所以我才问的
[Quote=引用 25 楼 steedhorse 的回复:]
所谓“线程就是进程”——这可能只是针对底层的实现来说。
从上层的API来看,对外怎么也得表现出同一个pid(哪怕通过欺骗手段),否则白实现了。
[/Quote]
beyonddream2008 2009-09-27
  • 打赏
  • 举报
回复
APUE2 11.4
[Quote=引用 22 楼 wen287877566 的回复:]
搂住好像对线程和进程理解的不是很清楚
其实getpid这个函数在进程和线程中都可以使用,这个就可以用一个很好的比喻: 楼主可以同时有几个亲兄弟姐妹,但是你们的爸爸妈妈都是只有一个,但是你们彼此之间又是不同的,
这下应该明白了许多吧?
[/Quote]
chenee543216 2009-09-27
  • 打赏
  • 举报
回复
ps -L 看线程id

线程不是进程!!!
晨星 2009-09-27
  • 打赏
  • 举报
回复
所谓“线程就是进程”——这可能只是针对底层的实现来说。
从上层的API来看,对外怎么也得表现出同一个pid(哪怕通过欺骗手段),否则白实现了。
geodge831012 2009-09-27
  • 打赏
  • 举报
回复
线程id还是会不一样的,但是进程id和线程组id是一样的。
快乐田伯光 2009-09-27
  • 打赏
  • 举报
回复
看看LinuxThread跟NPTL两种线程实现方式的不同就会明白了。如果用的是LinuxThread,不同线程的进程号会不一样,而NPTL不同线程的进程号是一样的。
wen287877566 2009-09-27
  • 打赏
  • 举报
回复
搂住好像对线程和进程理解的不是很清楚
其实getpid这个函数在进程和线程中都可以使用,这个就可以用一个很好的比喻: 楼主可以同时有几个亲兄弟姐妹,但是你们的爸爸妈妈都是只有一个,但是你们彼此之间又是不同的,
这下应该明白了许多吧?
yuelijun922 2009-09-26
  • 打赏
  • 举报
回复
linux下进程是进程,线程是线程
一个进程可以有多个线程,在一个进程下的多个线程下getpid是一样的

所谓的linux下的线程就是进程,是相对于别的操作系统而言的,也就是说linux下的相对于别的系统下的进程。
小菜_默 2009-09-26
  • 打赏
  • 举报
回复
学习、、、
一 铭 2009-09-26
  • 打赏
  • 举报
回复
posix 规定一个多线程程序必须要有一个相同的PID,但linux实现是以进程方式实现的,所以引入线程组,
一个线程组的PID是一样的,就是第一个线程的PID,他存放在tgid字段,getpid返回的是cuurent->tgid而不适pid,所以一个多线程应用程序中的所有线程共享相同的标识符。


beyonddream2008 2009-09-25
  • 打赏
  • 举报
回复
中文的啊。我一直搞不明白,BSD Soraris或者 Mac OS X都能理解,就是这个Linux 弄得我不知道UBUNTU和FEDORA是不是linux了
[Quote=引用 14 楼 iisbsd 的回复:]
[Quote=引用 12 楼 beyonddream2008 的回复:]
apue2 P291

中文的英文的?
[/Quote]
iisbsd 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 beyonddream2008 的回复:]
apue2 P291

中文的英文的?
beyonddream2008 2009-09-24
  • 打赏
  • 举报
回复
如果你搞明白了,那么请你告诉我,我很感谢,否则不要说些没用的。。。
[Quote=引用 10 楼 shisi 的回复:]
晕,概念都没有搞清楚就来说了~~~
[/Quote]
beyonddream2008 2009-09-24
  • 打赏
  • 举报
回复
apue2 P291
[Quote=引用 9 楼 hairetz 的回复:]
http://blog.csdn.net/hairetz/archive/2009/06/19/4281931.aspx

APUE你真的看了?哪里是这么说的?

[/Quote]
加载更多回复(11)

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧