一、定义
信号量 主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。
信号量的值为正的时候,说明它空闲,其值一般代表可用资源数目。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。
二、分类
-------- 内核态信号量
|---- 用户态信号量------- SYSTEM V 信号量
|--- POSIX 信号量 -------- 有名信号量 :其值保存在文件中
|--- 无名信号量 :其值保存在内存中
三、无名信号量
相关函数:
int sem_init(sem_t *sem, int pshared, unsigned int value);
1)pshared==0 用于同一多线程的同步;
2)若pshared>0 用于多个相关进程间的同步(即由fork产生的)
int sem_getvalue(sem_t *sem, int *sval);
取回信号量sem的当前值,把该值保存到sval中。
若有1个或更多的线程或进程调用sem_wait阻塞在该信号量上,该函数返回两种值:
1) 返回0
2) 返回阻塞在该信号量上的进程或线程数目
linux采用返回的第一种策略。
int sem_wait(sem_t *sem); // 这是一个阻塞的函数
测试所指定信号量的值,它的操作是原子的。
若sem>0,那么它减1并立即返回。
若sem==0,则睡眠直到sem>0,此时立即减1,然后返回。
int sem_trywait(sem_t *sem); // 非阻塞的函数
其他的行为和sem_wait一样,除了:
若sem==0,不是睡眠,而是返回一个错误EAGAIN。
int sem_post(sem_t *sem);
把指定的信号量sem的值加1;
呼醒正在等待该信号量的任意线程。
注:这些函数中,只有sem_post是信号安全的函数,它是可重入函数
无名信号量的常见用法是将要保护的变量放在sem_wait和sem_post中间所形成的
临界区内,这样该变量就会被保护起来
阅读(739) | 评论(0) | 转发(0) |