29信号量和进程间通信

信号量

信号量         --- 线程间有顺序的协调工作

信号量(资源个数)

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种,其中最高效的是共享内存,而今天学习了管道的使用,通过创建管道,可以实现不同进程之间的通信。后面的学习继续努力,加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值