tlpi:更多细节(pthread_sigmask, pthread_kill, pthread_sigqueue, sigwait,

更多细节
线程栈

创建线程时,每个线程都有一个属于自己的栈,且大小固定,在Linux/x86-32架构下,除了主线程之外,所有的栈的缺省大小为2MB

可以通过pthread_attr_setstacksize(),pthread_attr_setstack()等系统调用控制线程栈的大小

可以采用调用sysconf(_SC_THREAD_STACK_MIN)来确定可采用的线程栈的最小值

线程与信号

信号模型先于线程模型出现,因此将两者结合使用会产生很多棘手情况

UNIX的信号模型映射到线程中

关于信号有很多方面的操作,某些操作是在线程层面上,某些则是在进程层面上,下面给出汇总

  • 信号动作属于进程层面

    如果某一个进程的任何一个线程收到了一个未经处理的信号,且该信号的默认行为为停止或者终止,那么所有的线程将会停止或者终止

  • 对信号的处置属于进程层面

    进程中的所有线程共享对每个信号的处理设置

  • 信号的发送既可以针对整个进程,也可以针对某个线程

    如果满足一下三个信号之一,那么这个信号是面向线程的

    • 信号的产生源自于硬件异常(SIGBUS, SIGFPE, SIGKLL,SIGSEGV)
    • 信号试图对已经断开的管道进行写操作(SIGPIPE)
    • 由pthread_kill()或者pthread_sigqueue()所发出的信号,他们可以向同一进程下的指定线程发送信号

    其他所有信号均为面向进程的

  • 当多线程程序收到信号,并且该进程已经为该信号设置了信号处置,那么进程会任意选择一个线程来接受这一信号

  • 信号掩码属于线程层面

    每个线程都具有自己的信号掩码,并且他们会从他们的创建者那继承一份拷贝

    使用sigpend()返回的其实是整个进程和当前线程所挂起的信号的并集

  • 如果信号处理程序中断了对pthread_mutex_lock()的调用,那么该调用总是会自动重新开始

    pthread_cond_wait()则是要么自动重新开始,要么返回0表示遭遇了虚假唤醒

  • 备选信号栈是每个线程所特有的,新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值