信号量的本质就是一个计数器
在多线程访问临界资源的时候,如果临界资源中又有很多份分好的资源,那么就可以通过信号量来表示里面还有多少份资源,且每份资源只有一个线程可以访问
线程申请信号量成功,就一定有一份资源是你的:P操作
释放信号量:V操作
以此信号量就可以保护玲临界资源了。
环形变量基于信号量的互斥和同步
之前我们写的生产消费模型:两种线程访问的是一个整体临界资源,所以只允许一个线程进入临界区。通过锁来保护临界区,通过条件变量来实现合理的同步机制。
但是如果整体的临界区中又分为很多份资源,那么就允许同时多个线程访问这个整体,——并行,但是其中的每小份资源又只允许一个线程进来——互斥
——想要实现这样的功能就可以用信号量来维护。
基于信号量的互斥和同步
申请信号量也是原子的
和之前我们用锁+条件变量写的生产消费模型的不同:
1、之前的两种线程访问的都是一个整体的资源(阻塞队列)——所以把这个队列的操作用锁保护为临界区,而这里的是一个环形队列,里面又分为了很多小份,每份允许一个线程进入——所以要用两把锁,一把是保护正在生产的那一份资源,另一份保护的是正在消费的那一部分
2、有了信号量就不用考虑每次进入临界区是否有资源,只要进入就一定有资源,这样就可以不用条件变量的等待队列了。
当为满的时候,就会出现生产一个消费一个——同步(为空也一样)
注意:释放的是对方的信号量:
代码:
j基于线程的信号量