更多细节
线程栈
创建线程时,每个线程都有一个属于自己的栈,且大小固定,在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表示遭遇了虚假唤醒 -
备选信号栈是每个线程所特有的,新