Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69215
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-27 15:04
个人简介

记录,分享

文章分类

全部博文(43)

文章存档

2017年(24)

2015年(1)

2014年(18)

我的朋友

分类: C/C++

2014-08-26 23:45:52

一、定义
信号量 主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。
信号量的值为正的时候,说明它空闲,其值一般代表可用资源数目。所测试的线程可以锁定而使用它。若为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中间所形成的
临界区内,这样该变量就会被保护起来



阅读(733) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~