课程名称:C/C++气象数据中心实战,手把手教你做工业级项目
课程章节:2.10 linux共享内存
主讲老师: 吴从周
课程内容:
描述并理解信号量的概念和原理。
采用测试程序对信号量的操作函数进行讲解
加深信号量在实际运用中的使用技巧。
课程收获:
信号量本身实质是一个非负数的计数器,我们使用其给共享资源建立标志,表示共享资源的占用情况,当共享资源被占用时,我们通过信号量反馈给此时此刻也需要调用此共享资源的程序,禁止其在此时调用共享资源。当共享资源调用结束时,我们通过改变信号量的值,表示此时开始可以进行对共享资源的访问。
每个执行程序在进入临界区之前都应该先申请信号量,申请成功就有了操作特点的临界资源的权限,当操作完毕后就应该释放信号量。
信号量的PV操作,
P操作:我们将申请信号量称为P操作,申请信号量的本质就是申请获得共享资源的使用权限,当申请成功时资源的数目应该减一,因此P操作的本质就是让计数器减一。
V操作:我们将释放信号量称为V操作,释放信号量的本质就是直接归还共享资源的使用权限,当释放成功共享资源的数目就应该加一,因此V操作的本质就是让计数器加一。
例如网吧的机子数量,这个数量是有限的,当一个人进行开机之后,机子数量就会减1,类似于P操作,下机之后,机子数量就会+1,类似于V操作。当共享空间需要只能同时被一个程序访问修改时,机子的数量就是1。
注意:PV操作是原子操作,因为PV操作的本质上也应该是共享资源,不能重复对PV操作使用信号量机制
信号量的函数
常用的就是初始化信号量函数,int sem_init(sem_t *sem, int pshared, unsigned int value);
sem:需要初始化的信号量。semget函数用于创建或者获取信号量,返回值是信号量的标志码,和共享内存的操作函数十分类似。
pshared:传入0值表示线程间共享,传入非零值表示进程间共享。
value:信号量的初始值(计数器的初始值)。
一般后两个参数都可以是缺省值,初始化信号量成功返回0,失败返回-1。
semctl函数,sem_op函数
int semctl(int semid, int semnum, int cmd, ...);
采用此函数可以对信号量进行高级操作,在生产实际中主要用于设置信号量的初始值。sem_op函数用于PV操作,信号量的值无法直接进行加减运算,需要通过op函数进行,PV操作中所运用的函数实际上是一样的,只是赋值不同。
共同学习,写下你的评论
评论加载中...
作者其他优质文章