zoukankan      html  css  js  c++  java
  • 【APUE】线程与信号

    每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。进程中的信号是递送到单个线程的。

    线程中pthread_sigmask函数类似与进程的sigprocmask函数,可以用来阻塞信号。

    #include <signal.h>

    int pthread_sigmask(int how,const sigset_t *set,sigset_t *obset);

    线程可以通过调用sigwait等待一个或多个信号发生。

    #include <signal.h>

    int sigwait(const sigset_t *set,int *signop);

    set参数指出了线程等待的信号集,signop表明等到的是哪个信号

    线程在调用sigwait之前,必须阻塞那些它正在等待的信号,sigwait函数会自动取消信号集的阻塞状态。在返回之前,sigwait将恢复线程的信号屏蔽字。如果信号在sigwait调用的时候没有被阻塞,在完成对sigwait调用之前会出现一个时间窗,在这个窗口期,某个信号可能在线程完成sigwait调用之前就被递送了。

    如果多个线程在sigwait调用时,等待的是同一个信号,这时就会出现线程阻塞,当信号递送的时候,只有一个线程可以从sigwait中返回。

    要把信号发送到进程,可以调用kill,要把信号发送到线程,可以调用pthread_kill

    #include <signal.h>

    int pthread_kill(pthread_t thread,int signo);

    可以传一个0值的signo来检查线程是否存在。如果信号的默认处理动作是终止该进程,那么把信号传递给某个线程仍然会杀死整个进程。

    注意闹钟定时器是进程资源,所有线程共享相同的alarm,所以进程中的多个线程不可能互不干扰的使用alarm。

  • 相关阅读:
    JavaEE——SpringMVC(11)--拦截器
    JavaEE——SpringMVC(10)--文件上传 CommonsMultipartResovler
    codeforces 460A Vasya and Socks 解题报告
    hdu 1541 Stars 解题报告
    hdu 1166 敌兵布阵 解题报告
    poj 2771 Guardian of Decency 解题报告
    hdu 1514 Free Candies 解题报告
    poj 3020 Antenna Placement 解题报告
    BestCoder5 1001 Poor Hanamichi(hdu 4956) 解题报告
    poj 1325 Machine Schedule 解题报告
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3851286.html
Copyright © 2011-2022 走看看