1.信号量的概念
信号量是线程间有顺序的协调工作,信号量 (个数) 反映的是资源的数量,信号量起到锁的效果;
2.信号量的机制
(1)信号量描述可使用资源的个数;
(2)p操作,表示使用这个资源,资源数量-1;
p操作逻辑:尝试获取资源,有资源可用,直接使用,资源个数-1,如果没有资源可用,此时等待
(3)v操作,表示使用这个资源,资源数量+1;
v操作逻辑:表示产生这个资源,资源个数+ 1
写线程——写资源 buf [1024]
可以写数据的条件
1.开始时 ,buf空的,开始写入
2.写线程写完了,资源-1
读线程——读资源
1.写线程结束,读线程开始
2.读线程读完了,资源+1;
3.信号量使用
(1)定义信号量(全局区定义),如:sem_t sem_w (写入),sem_t sem_r (读取),头文件:#include <semaphore.h>
(2)初始化信号量(主函数开始处初始化):sem_init (&sem_w, 0, 1),sem_init (&sem_r, 0, 0)
sem_init的第二个参数表示信号量是在线程间使用还是在进程间使用,为0表示在线程间使用,非0表示在进程间使用,第三个参数表示资源,1表示有一个资源可用,0表示没有资源;
(3)信号量使用(线程中使用):sem_wait表示p操作,sem_post表示v操作;
线程1中sem_wait (&sem_w),sem_post (&sem_r),表示先进行p操作,sem_w资源-1,然后进行v操作,sem_r资源+1;
线程2中sem_wait (&sem_r),sem_post (&sem_w),表示先进行p操作,sem_r资源-1,然后进行v操作,sem_w资源+1;
(4)信号量销毁(主函数结束前销毁):sem_destroy(&sem_w), sem_destroy(&sem_r);
定义和使用信号量(全局区和线程内):
初始化和销毁信号量(主函数):
运行结果: