线程控制
线程的属性
设置线程是否是分离状态(一创建就是分离,而不是调用pthread_detach函数进行分离)
设置线程的一些栈属性(栈的大小,栈的最低地址等等)
并发度:控制着用户级线程和内核线程之间的关系
线程属性—取消选项
明白有一个“取消点”的概念:这属于延迟取消,
取消点可以是一些系统默认函数,也可以自己设置
相对于延迟取消,那么也可以调用函数设置为异步取消
也可以设置成disable状态,那么调用cancel就不会取消线程
线程同步属性
互斥量属性:共享属性
- 私有的:那么这个锁就在一个进程中活动,以供这些线程进行同步。
- 共有的:我们知道进程是写时复制,有一块区域时共享的,那么锁此时就作用与这个区域,用来控制进程之间的同步
互斥量属性:类型属性
- 用来控制这个锁是:一般锁,自检锁还是递归锁,
线程重入(是针对函数的概念)
这儿再次强调一个函数对于线程可重入 != 一个函数对于异步信号处理函数可重入。
线程安全:一个函数能够可以在同一时刻(一个函数没结束之前)被多个线程安全的调用,那么我们就称为是线程安全的。
不安全的原因:因为这些函数范围的数据是自动放置在我们的静态内存缓冲区的。如果想要安全也可以改变函数的结构自己提供一个安全的缓冲区(自带)
线程的私有数据
为啥需要线程的私有数据
- 需要维护每个线程的信息
- 提供了基于进程的接口用于多线程的机制
需要创建一个与线程数据相关联的key来访问我们的私有数据
可以利用一个函数pthread_once来控制一个线程只做过一件事(这儿用来只创建一个key)
线程和信号
1.每个线程都有自己的信号屏蔽字(阻塞),但是信号的处理方式是进程中所有的线程所共享的
2.进程中的信号是递送到单个线程的
1.与硬件故障或者计时器相关的的信号是递送到引发该信号的线程中去的
2.而其它的信号则是发送到了任意一个线程
3.线程是调用pthread_sigmask来阻塞信号
4.线程是调用sigwait来等待某一个信号
在一个线程调用sigwait之前必须阻塞要等待的信号(不阻塞的话,那么信号直接就在我使用wait之前就处理了,我这个wait有什么用呢)。当调用了sigwait之后,会取消这些信号的阻塞,就也是开放大门,让信号能够进来。当接到一个信号之后,我就移除那些还在门口的信号,并关上了大门,继续阻塞。当存在信号处理函数的时候(进程设置的),只能调用其中一个
5.信号发送到进程用kill,而发送到线程用pthread_kill。可以发送0信号来检测一个线程是否存在
线程与I/O
我们使用原子操作函数:pwrite和pread函数来进行多线程级别的读写,避免竞争问题
线程和fork
父进程的任一线程调用fork,那么就会为进程创建一个新的子进程,子进程只有一个线程
子进程要么清理继承来的锁,要么就调用exec
如果需要清理锁的状态,那么就需要调用我们的一个函数,叫做:pthread_atfork函数(在程序中设置,一旦调用fork就调用这个函数)。注意这里面有三个参数:
prepare 处理程序
parent 处理程序
child 处理程序
这儿 prepare是获得(占有)父进程所有的锁。
parent在父进程对锁进行处理
child是对子进程的锁进行处理
XMind: ZEN - Trial Version