信号量是进化版的互斥锁,互斥锁只能供一个线程使用,信号量可以供多个线程使用。如果希望在多个线程之间对某对象的部分数据共享,互斥锁无法实现,只能将整个数据锁住,这样导致线程并发性下降。
信号量既能保持同步,数据又不混乱,又能提高线程并发。
主要函数:
int sem_int(sem_t* sem, int pshared, unsigned int value); //初始化信号量
int sem_destroy(sem_t* sem); //销毁信号量
sem是信号量;pshared取0用于线程间,取非0值(一般为1)用于进程间;value指定信号量初值。
int sem_wait(sem_t *sem) //相当于加锁,信号量>0,则信号量--(产品减少)。信号量=0(没有产品),则线程阻塞
int sem_post(sem_t *sem) //相当于解锁,信号量++(空位增加),唤醒阻塞在信号量上的线程
sem_t类型仍是结构体,但可看做整数,忽略细节,类似文件描述符。
规定信号量不能小于0,sem_t的实现对用户隐藏,所谓++和–是通过函数实现,信号量的初值,决定了占用信号量的线程个数。