线程操作相关函数
编译时必须链接pthread库
1. 获取线程自身ID:pthread_self
2. 创建线程:pthread_creat
线程创建时并不能保证哪个线程先运行。
3. 线程终止:pthread_exit pthread_cancel
如果进程中任意线程调用了exit _exit_Exit,那么整个进程就会终止。
单个线程终止可以通过3中方式退出:
a) 线程可以简单地从启动历程中返回,返回值是线程的退出码
b) 线程可以被同一进程中的其他线程取消pthread_cancel
c) 线程调用pthread_exit
4. 等待线程退出:pthread_join
调用线程将一直阻塞,直到指定的线程从启动例程中返回或被取消
线程同步
互斥量
1. 互斥量: 互斥量本质就是一个锁,在访问共享资源前对互斥量加锁,在访问完成后解锁。对互斥量加锁后任何其他试图再次对该互斥量加锁的线程都会被阻塞直到当前线程解锁该互斥量。
2. 初始化互斥量:互斥锁初始化分为两种
静态初始化,即pthread_mutex_tmutex = PTHREAD_MUTEX_INITIALIZER。
动态初始化,即pthread_mutex_init()。动态初始化的互斥锁在释放前要用pthread_mutex_destroy()进行反初始化。
3. 互斥量加锁和解锁:
使用pthread_mutex_lock对互斥量加锁,如果互斥量已经上锁,调用进程将阻塞直到互斥量被解锁。
使用pthread_mutex_trylock对互斥量加锁,如果互斥量已经上锁,调用进程则不会被阻塞,而是直接返回EBUSY。
使用pthread_mutex_timedlock对互斥量加锁,如果互斥量已经上锁,调用进程会阻塞一定时间后返回ETIMEDOUT。
条件变量
1. 条件变量与互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定后才能计算条件。
2. 初始化条件变量
静态初始化,即pthread_cond_tcond = PTHREAD_COND_INITIALIZER。
动态初始化,即pthread_cond_init()。动态初始化的条件变量在释放前要用pthread_cond _destroy()进行反初始化。
3. 等待条件变量
传递给pthread_cond_wait的互斥量对条件进行保护。
调用者吧锁住的互斥量传给函数,函数然后自动把调用线程放到等待条件的线程列表上,对互斥量解锁,这样关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道,这样就不会错过条件的任何变化。
pthread_cond_wait返回时,互斥量再次被锁住。
4. 激活条件变量
函数pthread_cond_signal至少能唤醒一个等待该条件的线程
函数pthread_cond_broadcast则能唤醒等待该条件的所有线程。