Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2148068
  • 博文数量: 333
  • 博客积分: 10161
  • 博客等级: 上将
  • 技术积分: 5238
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-19 08:59
文章分类

全部博文(333)

文章存档

2017年(10)

2014年(2)

2013年(57)

2012年(64)

2011年(76)

2010年(84)

2009年(3)

2008年(37)

分类: LINUX

2013-12-19 16:54:37

信号量

信号量(semaphore)与已经介绍过的IPC机构(管道,FIFO和消息队列)不同,它是一个计数器,用于多进程对共享数据对象的访问。

为了获取资源,进程需要执行下列操作:
1) 测试控制该资源的信号量
2) 若此信号量的值为正,则进程可以使用该资源。 使用了一个资源单位,值减一。
3)  若此信号量的值为0,则进程进入休眠状态。直至信号量大于0被唤醒。



在Linux上,记录锁与信号量锁相比,在时间上要多耗用约60%。
虽然记录锁慢于信号量锁,但如果只需一个资源(如共享存储段)并且不需要使用xsi信号量的所有花哨功能,则宁可使用记录锁。理由是使用简易,且进程终止时系统会处理任何遗留下来的锁。
记录锁的功能是:当一个进程正在读或者修改文件的某个部分时,它可以阻止其他进程修改同一文件区。
Posix IPC信号量的使用如下步骤小结:
 1.声明信号量sem_t sem1;
 2.初始化信号量sem_init(&sem1,0,1); /
 3.sem_post和sem_wait函数配合使用来达到线程同步
 4.释放信号量int sem_destroy (sem_t *sem1);

System V IPC信号量使用小结:
数据结构
/* semop system calls takes an array of these. */
struct sembuf {                                                                                    
    unsigned short  sem_num;    /* semaphore index in array */
    short       sem_op;     /* semaphore operation */
    short       sem_flg;    /* operation flags */
};

1. int semid 
2. semget() to get a semaphore set identifier。
3.define one sembuf for sem operation: 
    struct sembuf sbuf;
4. semop() semaphore operations
5. semctl() semaphore control operations , we using it to remove semaphore set.




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