LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1490|回复: 10

关于apue线程部分的一点疑问

[复制链接]
发表于 2010-3-19 14:41:01 | 显示全部楼层 |阅读模式
看到apue上讲到,由于linux是用进程去实现线程的,因此异步信号发送到特定线程,因为每个线程作为独立的进程运行,系统就不能选择当前还没有阻塞该信号的线程,这样可能导致信号被忽略。同时之前章节讲到在linux中不同线程的进程id是不同的。

可是我在现在较新的linux上做实验,发现其实不同线程的进程id是相同的,因为现在getpid系统调用返回的是线程组ID。这已经和APUE写作时的linux有不同。

请问现在linux对posix thread的实现中,多线程还有可能忽略掉这样的信号吗?
发表于 2010-3-19 15:51:21 | 显示全部楼层
在linux上,可以用gettid取代getpid。
然后用kill或者sigqueue发送信号给指定进程。
回复 支持 反对

使用道具 举报

发表于 2010-3-19 15:57:44 | 显示全部楼层
不是吧?linux只是用进程来实现线程,线程跟进程还是不能等同的。
我记得进程间的信号量和线程的信号量实现的是不一样的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-19 16:52:48 | 显示全部楼层
Post by realtang;2076405
在linux上,可以用gettid取代getpid。
然后用kill或者sigqueue发送信号给指定进程。
不知道我的理解对吗,因为gettid返回的是内核线程id,而内核线程id又对应一个进程创建的所有线程,向这个内核进程id发送信号就会给该进程创建的所有线程发送信号,同时这个信号也不会apue中讲的那样被忽略。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-19 16:56:04 | 显示全部楼层
Post by haohao_h;2076407
不是吧?linux只是用进程来实现线程,线程跟进程还是不能等同的。
我记得进程间的信号量和线程的信号量实现的是不一样的!
不知道我看到的对不对,linux线程和进程的唯一区别就是clone时候传递的参数不一样,导致其共享资源的不同。
回复 支持 反对

使用道具 举报

发表于 2010-3-19 17:52:36 | 显示全部楼层
Post by qiaomuf;2076424
不知道我的理解对吗,因为gettid返回的是内核线程id,而内核线程id又对应一个进程创建的所有线程,向这个内核进程id发送信号就会给该进程创建的所有线程发送信号,同时这个信号也不会apue中讲的那样被忽略。
gettid获得的是的线程的真正内核ID,每一个不同的线程都对应一个唯一的tid。
另外如果用gettid,那么只会在Linux有效,在其他posix环境是不能portable的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-19 22:30:28 | 显示全部楼层
Post by realtang;2076442
gettid获得的是的线程的真正内核ID,每一个不同的线程都对应一个唯一的tid。
另外如果用gettid,那么只会在Linux有效,在其他posix环境是不能portable的。
那就是说这样只能向某个具体的线程发送信号,而不能向某个进程所创建的所有线程发送一个信号,并由内核去选择具体哪个线程来处理信号?
回复 支持 反对

使用道具 举报

发表于 2010-3-20 16:18:14 | 显示全部楼层
Post by qiaomuf;2076497
那就是说这样只能向某个具体的线程发送信号,而不能向某个进程所创建的所有线程发送一个信号,并由内核去选择具体哪个线程来处理信号?

Linux内核还没有这么强大,不过你可以自己动手。
回复 支持 反对

使用道具 举报

发表于 2010-3-20 21:44:14 | 显示全部楼层
每个线程有自己的 私有信号挂起队列
并且线程组中所有的线程还有一个共享的信号挂起队列

由kill()和和sigqueue()产生的信号会挂到线程组的共享信号队列中,内核会随意选择一个不会阻塞该信号的线程执行信号处理函数

tkill()给线程发送的信号会挂到线程的私有信号挂起队列中,由该线程执行相应的信号处理函数
回复 支持 反对

使用道具 举报

发表于 2010-3-20 23:17:19 | 显示全部楼层
楼上说的很清楚,我对kill的理解没有你理解的好。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表