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。

  • 相关阅读:
    Django模板语言进阶
    ORM基础之ORM介绍和基础操作
    ORM关于表那些事
    ORM之基础操作进阶
    ORM基础之字段及其参数介绍
    AJAX初识(原生JS版AJAX和Jquery版AJAX)
    AJAX异步、sweetalert、Cookie和Session初识
    在一个千万级的数据库查寻中,如何提高查询效率?
    A fatal error has been detected by the Java Runtime Environment(jdk 1.6的一个BUG)
    外网映射工具地址
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3851286.html
Copyright © 2011-2022 走看看