Android跨进程通信-信号量

2021-01-18  本文已影响0人  凯玲之恋

信号量的使用和原理

信号量和信号是不同的IPC通信机制,信号量是在进程之间传递是一个整数值,信号量只有三种操作可以进行:初始化,P操作,V操作,我们看一下具体的使用函数和数据结构。

#include<sys/sem.h>
​
int semget(key_t key, int num_sems, int sem_flags);//创建新信号量或获取已有的信号量
int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);//改变信号量的值
​
struct sembuf{
    short sem_num;
    short sem_op;//通常是两个数,一个是-1,即P操作,一个是+1,即V操作。
    short sem_flg;//跟踪信号
};

我们通过semget()函数获取或者创建一个信号量,并返回一个信号量id,有了这个id,我们就可以通过semop()函数进行V和P的操作。

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

这三种操作都是原子操作,我们通常用信号量来进行并发和同步的控制。

信号量的分类

Linux提供两种信号量

  • 内核信号量:由内核控制路径使用
  • 用户态进程使用的信号量:这种信号量又分为POSIX信号量和SYSTEM V信号量
  • 有名信号量:其值保存在文件中,所以它可以用于线程也可以用于进程间同步
  • 无名信号量:其值保存在内存。

POSIX信号量和SYSTEM V信号量的比较

不免要提一下互斥锁Mutex,信号量可以是非负整数,互斥锁只能是0和1两个值,我们可以将Mutex理解为特殊的信号量。

在大部分情况下,用互斥锁来做并发的控制会比信号量更方便。

什么是信号量

信号量的注意事项

上一篇 下一篇

猜你喜欢

热点阅读