多线程与信号

参考地址:

https://www.cnblogs.com/coding-my-life/p/4782529.html(很大帮助)

http://blog.csdn.net/zhangfulin_hwatop/article/details/8567490

https://www.cnblogs.com/clover-toeic/p/4126594.html


UNIX信号以前是专为进程设计的,它比线程的出现早了很多年。当线程模型出现后,专家们试图也在线程上实现信号,这导致了一个问题:如果要在线程模型中保持原来在进程中信号语意不变,是相当困难的。

避免信号和线程一起使用是明智的选择。但是,将他们分开又是不可能或不实际的。只要有可能的话,仅仅在主线程内使用pthread_sigmask()来屏蔽信号,然后 同步地 在专用线程中使用sigwait()来处理信号。——即异步产生的信号用同步的方式处理:为了防止信号中断线程,可以把信号加到每个线程的屏蔽字中,再在专门的线程中处理信号(即1、)。


进程中的信号发送方式有:

  1. 如果是异常产生的信号(比如程序错误,像SIGPIPE、SIGEGV这些),则只有产生异常的线程收到并处理。
  2. 如果是用pthread_kill产生的内部信号,则只有pthread_kill参数中指定的目标线程(同一进程内)收到并处理。
  3. 如果是外部使用kill命令产生的信号,通常是SIGINT、SIGHUP等job control信号,则会遍历所有线程,直到找到一个不阻塞该信号的线程,然后调用它来处理。(一般从主线程找起),注意只有一个线程能收到。

1、第3种信号发送下决定信号发送到哪个线程

主线程阻塞SIGINT,其他子线程都初始继承主线程屏蔽字,即初始也阻塞SIGINT,因此可以通过下面两种方式达成:

  1. 在需要接受该信号的线程sigwait() 放入“等待信号集”即可;#include <signal.h>  int sigwait(const sigset_t * restrict set, int* restrict signop);
  2. 在线程内的屏蔽字上解阻塞掉该信号即可。#include <signal.h>  int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值