信号量
信号量(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) |