【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。

【APUE】线程与信号

时间: 2024-11-10 15:42:58

【APUE】线程与信号的相关文章

12.8 线程和信号

在基于进程模型的信号处理已经比较吗麻烦了,引入线程后事情就更加复杂了. 每个线程拥有其自身的信号掩码,但是信号处理函数是被进程内的所有线程共享的,作为一个推论,独立的线程能够阻塞信号,但是如果一个线程修改与给定信号的处理动作的时候,所有的线程都会共享这一修改.也就是说,如果一个线程选择忽略一个给定信号,其他的线程可能会通过恢复默认呢处理或者是安装信号处理函数的方式撤销线程所做的忽略选择. 信号会只会被发送到进程内的一个线程.如果信号与硬件错误相关,那么信号通常被发送到造成时间发生的线程,其他信号

[APUE] 线程池

1 线程池技术简介 "池"化技术通常都是为了应对"小"的特点而开发出来的,比如: 内存池是针对小块内存的申请和释放过于频繁导致的效率低下问题.先分配一定量的内存,按照大小分类,当程序需要小块内存(这里的小是相对而言的,看实现方式)时,就从某个大块内存中截取小块内存,用完了之后,就再放入大块内存中.当然,这里说的只是基本的思想,在实现的时候,有针对不同的分配方式的优化方案. 线程池是针对大量短任务申请线程和释放线程过于频繁导致的效率低下问题,如果任务运行时间较短,而申

&lt;&lt;APUE&gt;&gt; 线程

一个进程在同一时刻只能做一件事情,线程可以把程序设计成在同一时刻能够做多件事情,每个线程处理各自独立的任务.线程包括了表示进程内执行环境必需的信息,包括进程中标识线程的线程ID.一组寄存器值.栈.调度优先级和策略.信号屏蔽字.errno变量以及线程似有数据.进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本.程序的全局内存.栈及文件描述符. 使用线程的好处:(1)为每种事件分配单独的线程.能够简化处理异步事件的代码:(2)多个线程自动地可以访问相同的存储地址空间和文件描述符:(3)

线程的信号机制

摘自:http://www.cnblogs.com/willick/p/4177977.html  仅供参考学习 有时候你需要一个线程在接收到某个信号时,才开始执行,否则处于等待状态,这是一种基于信号的事件机制..NET框架提供一个ManualResetEvent类来处理这类事件,它的 WaiOne 实例方法可使当前线程一直处于等待状态,直到接收到某个信号.它的Set方法用于打开发送信号.下面是一个信号机制的使用示例: 1 //线程的信号机制 2 #region 3 var signal = n

APUE: 线程相关库函数

线程有时称为轻权进程. 进程的所有信息对该进程的所有线程都是共享的. 每个线程有一个线程ID,线程ID只在它所属的进程环境中有效. 线程从进程继承的东西: 进程ID 地址空间 浮点环境 信号屏蔽字(不包括未决的信号集) 线程间共享的东西: 进程指令 大部分数据 信号处理程序和信号处理 当前工作目录 用户ID和组ID 线程间独立的东西: 线程ID 寄存器集合 栈 errno 信号掩码 优先级 所有线程函数返回类型为int的成功返回0,失败返回错误码,不设置errno. 线程编程需要链接库: -lp

内核线程对信号的处理策略

一.引出 大家都知道,信号是在进程返回用户态的时候触发执行的一种机制,但是对于内核线程来说,它们并不会返回用户态.这就好像<大话西游>里打劫脚底板的时候那位坐轿的官人没有脚底板一样尴尬.另一方面,通过sigprocmask是不能屏蔽掉SIGKILL和SIGSTOP两个信号的,所以如果我们通过kill -9 来杀死一个内核线程的话,内核线程是否会被杀死,如果会,它又是何时如何处理信号的呢? 二.内核线程对信号的处理 1.屏蔽 daemonize: /* Block and flush all s

线程与信号,线程与锁

#include<stdio.h> #include<apue.h> #include<pthread.h> pthread_mutex_t number_mutex = PTHREAD_MUTEX_INITIALIZER; int globvar = 0 ; void *write_p(void *arg){ while(1){ pthread_mutex_lock(&number_mutex); globvar++; printf("the wri

QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽

在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. 程序截图: 上代码: [cpp] view plaincopyprint? #include <QtGui> #include <QtCore> #include <windows.h> class Thread : public QThread { Q_OBJECT private: int number; protected: void run

Qt跨线程发送信号与元数据

转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39395025 Qt的signals/slots是可以用在线程间的.由于事件循环(event loop)是在主线程完成的,所以在非主线程发送一个信号时,对应的槽函数将会由主线程执行. 熟悉多线程的读者应该都感受到这里会有一个微妙的问题.如果signals/slots的函数参数是一个自己定义的类型.比如自己定义了一个Student类,信号函数为sendStudent(const Stude