Posix信号量

来源:互联网 发布:怎么获得淘宝代金券 编辑:程序博客网 时间:2024/05/18 19:22
http://www.cnblogs.com/Anker/archive/2013/01/13/2858765.html


Posix信号量
信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。信号量的使用主要用来保护共享资源,使得资源在一个时刻只有一个进程(线程)锁拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。Posix信号量分为有名信号量和无名信号量(基于内存的信号量)


有名信号量可以用于线程间的同步也可用于进程间的同步
1. 由sem_open来创建一个新的信号量或打开一个已存在的信号量,
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
返回:若成功则指向信号量的指针,若出错则为SEM_FAILED其中,第三、四个参数可以没有,主要看第二个参数如何选取。
oflag参数:可以是0,O_CREATE或O_CREAT|O_EXCL。如果指定O_CREAT标志而没有指定O_EXCL,那么只有当所需的信号量尚存在时才初始化它。但是如果所需的信号量已经存在也不会出错,但是如果在所需的信号量存在的情况下指定O_CREAT|O_EXCL却会报错。
mode参数:指定权限位
value参数:指定信号量的初始值,该初始值不能超过SEM_VALUE_MAX(这个常值至少为32767),二值信号量的初始值通常为1,计数信号量的初始值往往大于1.
用sem_close来关闭信号量。


2. 使用sem_unlink删除信号量
int sem_unlink(const char *name); 返回:成功返回0,出错返回-1.


3. 获取信号量的当前值
int sem_getvalue(sme_t *sem, int *valp); 返回:成功返回0,出错返回-1.
sem_getvalue在由valp指向的整数中返回所指定信号量的当前值,如果信号量当前已上锁,那么返回值或为0,或为某个负数,绝对值即为等待该信号量解锁的线程数。


4. 信号量的等待:(P操作,也称为递减down或上锁lock)
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem); 返回:成功返回0,出错返回-1.
sem_wait函数测试所指定信号量的值,如果该值大于0,就将它的值减1并立即返回,如果该值等于0,调用线程就被投入睡眠中,直到该值变为大于0,这时再将它减1,函数随后返回。“测试并减1”操作必须是原子的。sem_wait和sem_trywait的差别是:当所指定信号量的值已经是0时,后者并不将调用的进程投入睡眠。相反,它返回一个EAGAIN错误,如果被某个信号中断,sem_wait就可能过早的返回,返回的错误为EINTR。


5. 信号量的挂出:(V操作,也称为递增up或解锁unlock)
int sem_post(sem_t *sem);返回:成功返回0,出错返回-1 将所指定的信号量值加1


Posix基于内存的信号量
Posix有名信号量创建时候是用一个name参数标识,它通常指代文件系统中的某个文件。而基于内存的信号量是由应用程序分配信号量的内存空间,即分配一个sem_t数据类型的内存空间,人后由系统初始化它们的值
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_destroy(sem_t *sem);
如果shared=0,那么待初始化的信号量是在同一进程的各个线程间共享的,否则该信号量是在进程间共享的,此时该信号量必须存放在某种类型的共享内存区中,使得用它的进程能够访问该共享内存区。value是该信号量的初始值。
0 0