图像检索服务器编写问题记录——线程中信号的处理方式思考

来源:互联网 发布:iphone软件开发教程 编辑:程序博客网 时间:2024/04/29 15:24

【信号的分类】:

1.SIGKILL、SIGSTOP这两个信号单独一类,这两个信号不能被捕捉、忽略和阻塞。表示杀死进程和暂停进程,它们为root提供了一种一定可以杀死或暂停进程的方法。

2.SIGBUS、SIGFPE、SIGSEGV这类由硬件引起的硬件故障、段错误、除0错误等信号只会发送给引起该硬件错误的线程。【对于多线程而言是:同步信号,不能阻塞、忽略,只会送往产生信号的那个线程;但如果是其他线程用pthread_kill发送的这类信号,那么是可以阻塞的】

3.SIGCHLD、SIGALRM、SIGUSR1等等普通信号【这个原来叫异步信号,可以被阻塞,忽略,送往其他线程处理】

4.对于多线程而言,还有一类由pthread_kill发送的定向信号。

【信号的处理方式】:

1.捕捉;2.忽略;3.默认处理

【信号的状态】:

1.信号产生;2.信号未决;3.信号递送。信号在产生和递送成功之间的过程叫信号未决。若某信号没有被设置成忽略、那么阻塞信号的行为导致的是信号未决。

【信号传递方式与多线程】:

1.第一类信号即SIGKILL它们,无法被捕捉、忽略和阻塞。处理过程中我们不去管它

2.第二类信号即SIGBUS等硬件故障引起的信号,只会被发送到引起故障的那个线程,所以所有线程不能阻塞、忽略这些信号,需要捕捉该信号

3.第三类信号即SIGCHLD等普通信号,会随机发送到进程中的任意一个线程来处理。为此我们打算在工作线程和主线程中阻塞这些信号,交由专门的信号处理线程去处理这些信号,这样主线程和工作线程就不会被打断,也不用去考虑函数的可重入与否。

【信号处理与多线程】:

同个进程中的线程们共享信号处理器,但可以拥有自己的信号屏蔽集。即若在主函数中安装处理SIGBUS的信号处理函数,那么其他线程也是共享这个信号处理函数的。若在主线程中没有阻塞信号SIGUSR1,那么在其他线程中同样可以用pthread_sigmask来阻塞该信号,不处理该信号。

信号发送到进程会寻便所有进程中的线程,让找到的第一个未阻塞本信号的线程来处理自己。

【信号捕捉方法】

1.sigaction(signal):sigaction在一个线程中对某信号的注册行为,在同个进程中的其他线程共享这种行为。对实时处理要求高的信号,用sigaction来安装信号捕捉处理函数

2.sigwait:sigwait只处理那些被(其他所有线程)阻塞的信号。它将到来的信号们排排队,挨个处理,实时性要求低的信号们该采用的方法

【本图像检索服务器对信号的处理方式】

1.对于第二类信号SIGBUS这种只会发送到本线程的,我使用sigaction捕捉处理

2.对于第三类信号SIGCHLD这种的,专门开一个线程来处理信号,以免打扰工作线程和主线程工作。方式是sigwait,sigwait在没有信号到来是会挂起线程,避免线程空转




0 0
原创粉丝点击