信号量semaphore也是用于线程同步的锁机制,可以理解为是进阶版的互斥锁:
由于互斥锁的粒度较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁就没有办法实现,只能将整个对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却导致线程的并发性下降。线程就从并行执行变成了串行执行。与直接使用单进程一样了。
信号量相当于初始化为N的互斥量,可以允许同时有N个线程来访问公共区域。既能保证同步,数据不混乱,又能提高线程并发
信号量常见应用函数:
sem_init
初始化
sem_destory
销毁
sem_wait
加锁,信号量大于0,则信号量–;信号量等于0则线程阻塞
sem_trywait
sem_timedwait
sem_post
解锁,将信号量++,同时唤醒阻塞在信号量上的线程
sem_t
类型,本质仍是一个结构体,但仍旧在应用期间可以看作一个整数
信号量不能小于0,需要头文件<semaphore.h>
由于信号量类型sem_t的实现对用户隐蔽,所以对信号量的++、–操作都只能通过函数来实现,为不能直接++、–信号量,即需要sem_wait()
和sem_post()
;另外,信号量的初值,决定了占用信号量的线程的个