信号量
信号量 --- 线程间有顺序的协调工作
信号量(资源个数)
buf[1024] //公共资源
信号量机制:
信号量 --- 来描述可使用的资源的个数
p操作
表示 使用这个资源 资源个数减1
p操作逻辑:
尝试获取资源,有资源可用,直接使用,资源个数减一,如果没有资源可用,此时等待
v操作
表示 产生这个资源 资源个数加1
v操作逻辑:
释放一个资源,如果此时有任务,在等待这个资源,这个资源直接给对应的任务,如果没有任务需要使用这个资源,此时将资源个数加1
考虑的时候,站在使用者的角度考虑 //生产者消费者模型
写线程
---写资源
可以写数据的条件:
1、开始时,buf是空的
2、读线程读完了
读线程
//buf充当读资源
1、一开始,buf中没有数据可读
2、写线程结束
1、信号量的定义
sem_t sem;
信号量的类型 信号量的变量
sem_t sem_w;
sem_t sem_r;
2、信号量的初始化
sem_init
将已经定义好的信号量赋值
参数:
sam 要初始化的信号量
pshared = 0; 表示线程间使用信号量
!=0; 表示进程间使用信号量
value 信号量的初始值,一般为无名信号量
都是二值信号量,0 ,1
0 表示红灯,进程暂停阻塞
1 表示绿灯,进程可以通过执行
返回值:
成功 返回0
失败 返回-1
3、信号量的PV操作
P ==》申请资源 ==》 申请一个二值信号量
V ==》释放资源 ==》 释放一个二值信号量
sem_wait //p操作
判断当前sem信号量是都有资源可用
如果sem有资源(==1),则申请该资源,程序继续运行,如果sem没有资源(==0),则线程阻塞等待,一旦有资源,则自动申请资源并继续运行程序
注:
sem 申请资源后会自动执行 sem = sem - 1
参数:
sem 要判断的信号量资源
返回值:
成功 返回0
失败 返回-1
sem_post //v操作
函数可以将指定的sem信号量资源释放,并默认执行,sem = sem + 1;线程在该函数上不会阻塞
参数:
sem 要释放资源的信号量
返回值:
成功 返回0
失败 返回-1
4、信号量的销毁
sem_destroy
使用完毕将指定的信号量销毁
参数:
sem 要销毁的信号量
返回值:
成功 返回0
失败 返回-1
例:两个窗口交替售卖100张车票
资源的种类 资源的数量 如何抽象?
站在使用者的角度考虑
进程间的通信
进程创建好后,父子进程的空间相互独立
通信的方式:
//同一主机
1、古老的通信方式
管道:
无名管道(1)
有名管道(2)
信号(3)
2、IPC对象通信
消息队列(用的相对少)(4)
共享内存(*) //最高效(5)
信号量集() //信号量(6)
//不同主机
3、socket通信
网络通信(7)
管道
无名管道
pipe
创建一个管道
参数:
piprfd //用来获取 管道的两端
读端pipefd[0] 写端pipefd[1]
返回值:
成功 返回0
失败 返回-1
管道的特点:
1、管道大小 65536字节 64k
2、管道操作特点
数据读走之后,认为就没了
//写段存在,读端也存在
管道如果为空,此时可以一直写,直到写满,写阻塞
//写段存在,读端不存在
此时,写操作,会导致管道破 SIFGPIPE //这个信号会使得程序结束
//写段存在,读管道
可以读管道,但是管道中如果没有数据了,此时读操作 阻塞
//写段不存在,读管道
可以读管道,但是管道中如果没有数据了,读操作不阻塞,立即返回
----------------------------------
嵌入式学习第二十八天,今天学习了信号量的有关知识,信号量用来描述可使用资源的个数,通过定义信号量,可以实现线程间的顺序操作,通过PV操作,实现资源的获取和释放。同时也了解了关于进程间的通信方式,一共有7种,其中最高效的是共享内存,而今天学习了管道的使用,通过创建管道,可以实现不同进程之间的通信。后面的学习继续努力,加油。