信号量

来源:互联网 发布:苹果cms展示不会显示 编辑:程序博客网 时间:2024/05/17 02:29

一、信号量的解释

        信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外

部资源标识。信号量在此过程中负责数据操作的互斥、同步功能。

        当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状

态直至资源可用。在信号量的创建及初始化上,不能保证操作均为原子性。

二、为什么要使用信号量

        为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行

线程访问代码的临界区域。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它。

三、信号量的工作原理

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

P(sv):如果sv的值大于0,就给它减1;如果它的值为0,就挂起该进程的执行。

V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1。

四、用实例来理解信号量的工作机制

通过P,V操作让屏幕上打出AABBAABB....……,如果P,V操作不合理就会出现乱码。


































































































































































解释一下这几个函数:


















它的作用是创建一个新的或者得到一个已有的信号量。

第一个参数key是整数值(唯一非零),不相关的进程可以通过它访问一个信号量。

第二个参数num_sems指定需要的信号量数目,它的值几乎总是1。

第三个参数sem_flags是一组标志,当想要当信号量不存在时创建一个新的信号量,可以和值IPC_CREAT做按位或操作。设置了IPC_CREAT标志后,即使给出的键是一个已有信号量的键,也不会产生错误。而IPC_CREAT | IPC_EXCL则可以创建一个新的,唯一的信号量,如果信号量已存在,返回一个错误。

semget函数成功返回一个相应信号标识符(非零),失败返回-1.
















该函数用来初始化或者销毁一个信号量。

command通常是下面两个值中的其中一个:
SETVAL:用来把信号量初始化为一个已知的值。p 这个值通过union semun中的val成员设置,其作用是在信号量第一次使用前对它进行设置。

IPC_RMID:用于删除一个已经无需继续使用的信号量标识符。如果有第四个参数,它通常是一个union semum结构。











此函数是用来进行信号量的PV操作的。

返回值,函数调用成功返回1,失败返回0.

参数semid:通过上述semget获得的。

参数sops:指向信号量结构体数组的指针。

参数nsops:操作信号量的个数,即sops结构体变量的个数。
当sem_flg成员为SEM_UNDO时,它将使操作系统跟踪当前进程对这个信号量的修改情况,如果这个进程在没有释放该信号量的情况下终止,操作系统将自动释放该进程持有的信号量,从而使另外一个进程可以继续工作,防止其他进程因为得不到信号量而发生死锁现象,为此一般建议SEM_UNDO。

0 0
原创粉丝点击