和多进程程序一样,多线程程序也必须考虑同步问题。线程同步就是一个进程中多个线程协同步调,按预定的先后次序进行运行。pthresd_join可以看作简单的线程同步方式,但是它无法高效地实现复杂的同步需求。
线程同步的方式主要有三种:信号量(Semaphore)、互斥量(Mutex)、条件变量。本文主要阐述了信号量和互斥锁的用法。
信号量
进程同步控制所使用的信号量的函数以sem开头,而在线程中,POSIX信号量函数的名字都以sem_开头。以下六个函数都包含在头文件#include<semaphore.h>,并且以下函数成功时返回0,失败则返回-1并设置errno。
初始化信号量
int sem_init(sem_t* sem,int pshared,unisigned int value);
- sem 标识操作的信号量,一般是全局变量。
- pshared 共享,指定此信号量是否在进程间共享。(暂时还不支持,只是留了一个接口,只需设置为0即可)
- value 设置信号量的初始值(也就是临界资源的个数)。至少为1,否则无法使用。
使用信号量
int sem_wait(sem_t* sem);
- sem 标识操作的信号量,一般是全局变量。
sem_wait()函数以原子操作的方式将信号量的值减1(相当于P操作)。如果信号量的值为0,则sem_wait()将被阻塞,直到这个信号量具有非零值。
在使用临界资源前,先调用sem_wait()函数,对临界资源的个数