嵌入式学习第二十七天(linux多线程管道通信部分)

临界资源:

将可能被多个执行流同时访问的资源叫做临界资源,临界资源需要进行保护否则会出现数据不一致等问题

信号量的工作原理
由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:

1、P :  我们将申请信号量称为P操作,申请信号量的本质就是申请获得临界资源中某块资源的使用权限,当申请成功时临界资源中资源的数目应该减去一,因此P操作的本质就是让计数器减一,如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

2、V :  我们将释放信号量称为V操作,释放信号量的本质就是归还临界资源中某块资源的使用权限,当释放成功时临界资源中资源的数目就应该加一,因此V操作本质就是让计数器加一,如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给他加1。

PV操作必须是原子操作!

信号量函数

int sem_init ( sem_t *sem, int pshared, unsigned int value);

  • sem:需要初始化的信号量。
  • pshared:传入0值表示线程间共享,传入非零值表示进程间共享。
  • value:信号量的初始值(计数器的初始值)。

销毁信号量

int sem_destroy(sem_t *sem);

  sem:需要销毁的信号量

等待信号量的函数:

int sem_wait ( sem_t *sem);

sem:需要等待的信号量。

 发布信号量的函数:

int sem_post(sem_t *sem);

进程间的通信:通过管道实现;

管道概念:

管道(pipe)是一种特殊的文件类型,它在内存中创建一个缓冲区,用于存储一种命令的输出和另一种命令的输入

管道的特点:
   1.管道大小 65536字节   64k 
   2.管道操作特点 
     数据读走之后,认为就没了 
     
     //写端存在,读端也存在 
     管道如果为空,此时可以一直写,直到写满     
     
     //写端存在,读端不存在 
     此时,写操作,会导致管道破裂 
     SIGPIPE //这个信号会使得程序结束 
     
     
     //写端存在,读管道 
     可以读管道,但是管道中如果没有数据了,此时读操作 阻塞 
     
     //写端不存在,读管道 
     可以读管道,但是管道中如果没有数据了,此时读操作 不阻塞 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值