多线程与信号

来源:互联网 发布:淘宝退货官方寄快递 编辑:程序博客网 时间:2024/06/06 01:33

参考地址:

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);

原创粉丝点击