进程间通信系列:
进程间通信--信号
前次我们已经讲过了在进程中信号来进行进程间的一些简单通信
如果是多线程的情景下呢我门如何保证多线程情景下的一个同步问题呢?
下开始接触信号量的应用
什么是信号量
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。
信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量。这里主要讨论二进制信号量。
我是在做DSP内核通信的时候遇到了这些问题,我们可以使用信号量完成两个操作:
pend():if(cnt==0) HOP else {cnt-- pass};
send():cnt++
在linux下主要有以下几个函数帮助我们完成无名信号量的使用:
- semget 建立sem
int semget(key_t key, int num_sems, int sem_flags);
可以创建一个信号量,并设置信号量的权限,已有的num。
- semop
int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);
其中