免费注册 查看新帖 |

Chinaunix

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

请教多线程中信号的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-13 17:13 |只看该作者 |倒序浏览
最近在弄多线程和信号处理,有一些问题有点蒙,麻烦各位帮释疑,谢谢!

1,信号应该是针对进程的,但在多线程环境中能否在不同线程中设置不能信号处理函数,如果多个线程都设置了信号处理函数,那么应该以哪个为主?是以主线程设置的为主还是最后设置的为主,还是分别有效?

2,一个线程设置信号处理函数,而另一个线程设置阻塞该信号,结果如何?我试了下,现象好像是随主线程的信号处理,这个结论是否正确?

3,在有定时器的多线程网络程序中,SIGALRM信号是否干扰select?如果干扰了可以如何处理?才能保证既可以用定时器、又可以select

4,在有定时器的多线程程序中,一个线程中的timer是否会干扰其他线程的sleep,如果干扰了可以用select模拟的sleep来取代sleep吗?还是有其他方法?

5,有没有关于信号在多线程间如何运作的资料可查?

论坛徽章:
2
技术图书徽章
日期:2015-12-16 09:12:1619周年集字徽章-庆
日期:2019-09-12 16:09:19
2 [报告]
发表于 2011-11-14 14:27 |只看该作者
最近在弄多线程和信号处理,有一些问题有点蒙,麻烦各位帮释疑,谢谢!

1,信号应该是针对进程的,但在多 ...
thefirstz 发表于 2011-11-13 17:13



    多线程处理倒是用不少,可是很少有用到信号处理.

论坛徽章:
0
3 [报告]
发表于 2011-11-17 15:32 |只看该作者
同一个信号只能有一个线程的信号处理函数来处理吧,如果多个线程试图来处理同一个信号,会发生错误.

论坛徽章:
0
4 [报告]
发表于 2011-11-18 11:35 |只看该作者
本帖最后由 crazyhadoop 于 2011-11-19 08:36 编辑

总结了一下,如下:

1 signal函数 BSD/Linux的实现并不在信号处理函数调用时,恢复信号的处理为默认,而是在信号处理时阻塞此信号,直到信号处理函数返回。其他实现可能在调用信号处理函数时,恢复信号的处理为默认方式,因而需要在信号处理函数中重建信号处理函数为我们定义的处理函数,在这些系统中,较好的方法是使用sigaction来建立信号处理函数。

    2 发送信号给进程,哪个线程会收到? APUE说,在多线程的程序中,如果不做特殊的信号阻塞处理,当发送信号给进程时,由系统选择一个线程来处理这个信号。

    3 如果进程中,有的线程可以屏蔽了某个信号,而某些线程可以处理这个信号,则当我们发送这个信号给进程或者进程中不能处理这个信号的线程时,系统会将这个信号投递到进程号最小的那个可以处理这个信号的线程中去处理。

    4 如果我们同时注册了信号处理函数,同时又用sigwait来等待这个信号,谁会取到信号?经过实验,Linux上sigwait的优先级高。

    5 在Linux中的posix线程模型中,线程拥有独立的进程号,可以通过getpid()得到线程的进程号,而线程号保存在pthread_t的值中。而主线程的进程号就是整个进程的进程号,因此向主进程发送信号只会将信号发送到主线程中去。如果主线程设置了信号屏蔽,则信号会投递到一个可以处理的线程中去。

    6 当调用SYSTEM函数去执行SHELL命令时,可以放心的阻塞SIGCHLD,因为SYSTEM会自己处理子进程终止的问题。

    7 使用sleep()时,要以放心的去阻塞SIGALRM信号,目前sleep函数都不会依赖于ALRM函数的SIGALRM信号来工作。

论坛徽章:
0
5 [报告]
发表于 2011-12-07 13:37 |只看该作者
个人认为,在多线程中应该将进程中对信号的异步处理方式转化成同步的方式来处理,而且在多线程中处理信号,一般不用singal或者sigaction等函数,而是使用sigwait或者sigwaitinfo等函数,专门创建一个线程来同步的等待信号的出现,并对信号进行处理,使其它的线程不收到信号的影响。(个人的理解,仅供参考。)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP