基于信号量的生产者-消费者

信号量是进化版的互斥锁,互斥锁只能供一个线程使用,信号量可以供多个线程使用。如果希望在多个线程之间对某对象的部分数据共享,互斥锁无法实现,只能将整个数据锁住,这样导致线程并发性下降。
信号量既能保持同步,数据又不混乱,又能提高线程并发。

主要函数:

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的实现对用户隐藏,所谓++和–是通过函数实现,信号量的初值,决定了占用信号量的线程个数。

示例代码

猜你喜欢

转载自blog.csdn.net/yao5hed/article/details/82226854