Linux学习总结(七)

Linux学习总结(七)

多线程异步管理——信号

线程并没有自己完全独立的异步信号管理机制,因此需要依赖于所在的进程,每个线程仅仅只能管理自己私有的信号屏蔽集合。因此信号操作时具有一下操作

  • (1)每个线程可以向其他线程发送信号,pthread_kill()函数用来完成这一操作,接受者为对应的线程
  • (2)每个线程可以设置自己的信号屏蔽集合,而不影响同进程下的其他线程,但初值从创建线程中继承,创建时,如果原线程有任何未决信号并不被新线程继承。pthread_sigmask()函数用来完成这一操作,其类似于进程的sigprocmask()函数
  • (3)同进程下所有线程共享对某信号的处理方法,即收到某个信号后,执行相同的信号处理函数,虽然每个线程都可以调用signal或者sigaction设置针对某信号的处理方式,但仅最后一次设置的处理方式
  • (4)向某个进程中发送某个信号,如果该信号的操作是终止的,则整个进程下的所有进程都将终止
    线程信号管理

pthread_kill发送信号
pthread_kill函数用来在线程间发送信号

int pthread_kill(pthread_t _thread0d, int _signo)

该函数有两个参数,threadid是传送信号的目标线程,signo是要传送给线程的信号。pthreadKill()函数用于请求将信号传送给线程
如果signo为0,则检测该线程是否存在而不发送信号。成功完成后,pthread_kill()将返回0.否则就会返回一个错误编号,用于指明错误(未设置errno变量)
pthread_sigmask调用线程的信号掩码
pthread_sigmask函数用来检查(或更改)调用线程的信号掩码,其操作类似于第8章介绍的siprocmask()函数

int pthread_sigmask(int
_how, _const _sigset_t *_restrict_newmask, _sigset_t *_restrict _oldmask)

第一个参数how定义如何更改调用线程的信号掩码
SIG_BLOCK:将第二个参数所描述的集合添加到当前进程阻塞的信号集中
SIG_UNBLOCK:将第二个参数所描述的集合从当前进程阻塞的信号集中删除
SIG_SETMASK:不管之前的阻塞信号,仅设置当前进程阻塞的集合为第二个参数描述的对象
如果set是空指针,则参数how的值没有意义,且不会更改线程的阻塞信号集,因此该调用可用于查询当前受阻塞的信号
需要注意的是,要阻塞SIGKILL或SIGSTOP信号是不可能的,这是由系统强制执行的,而不会导致错误,成功完成后,pthread_sigmask()返回0,否则,返回错误编号来之名错误,另外,如果由于某种原因pthread_sigmask()失败,线程的信号掩码将不会变化

线程属性控制

线程的属性主要围绕其所能申请资源,用户能够显示管理的线程属性主要是其栈空间信息
用户可以修改的线程的属性主要包括
detach state:设置创建一个线程后,该线程是处于分离状态还是可连接状态,即设置该线程是否可以被其他线程通过调用pthread_join而等待,默认值为PTHREAD_CREATE_JOINABLE
guardsize:创建的线程的守护区大小,默认值为PAGESIZE
schedparam:设置线程调度策略关联属性参数,例如基于优先级策略的优先级值
schedpolicy:设置创建的线程使用的特定调度策略,例如基于FIFO,时间片或者优先级
inheritsched:设置线程调度策略及关

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值