Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48230
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-20 13:19
文章分类

全部博文(10)

文章存档

2016年(2)

2015年(8)

我的朋友

分类: LINUX

2015-04-19 23:17:07

同步保护方式有很多,互斥锁、读写锁、文件锁、信号量等。本文只总结Posix信号量和system v信号量。

(1)Posix信号量,包括无名信号量和有名信号量。函数接口如下: 


有名信号量 无名信号量
sem_open(); sem_init();
sem_wait(); sem_wait();
sem_trywait(); sem_trywait();
sem_post(); sem_post();
sem_getvalue(); sem_getvalue();
sem_close(); sem_destroy();
sem_unlink();  


有名信号量既可以用于进程间的同步,也可以用于线程间的同步;无名信号量需要在初始化的时候指定是进程间同步还是线程间同步,并且该信号量必须在共享内存区中。具体使用例子见上一篇文章。

(2)System V信号量提供的接口用起来比较麻烦,这里将其封装成PV操作,以便后用。

mySem.h


  1. #ifndef __MYSEM_H__  
  2. #define __MYSEM_H__  
  3.   
  4. #include   
  5. #include   
  6.   
  7. union semun  
  8. {  
  9.     int val;  
  10.     struct semid_ds *buf;  
  11.     unsigned short *ary;  
  12. };  
  13.   
  14. int sem_init(key_t key, int inival);  
  15. void P(int semid, char *from);  
  16. void V(int semid, char *from);  
  17.   
  18. #endif   



mySem.c

其中,SEM_UNDO是为了防止调用者没有释放信号量,进程没有释放已获取的信号量退出时,由操作系统恢复信号量的值。

  1. #include "mySem.h"  
  2.   
  3. int sem_init(key_t key, int inival)  
  4. {  
  5.     int semid;  
  6.     union semun ary;  
  7.     semid = semget(key, 1, IPC_CREAT | 0660);  
  8.     arg.val = inival;  
  9.     semctl(semid, 0, SETVAL, arg);  
  10.     return semid;  
  11. }  
  12.   
  13. void P(int semid, char *from)  
  14. {  
  15.     struct sembuf sb;  
  16.     sb.sem_num = 0;  
  17.     sb.sem_op = 1;  
  18.     sb.sem_flg = SEM_UNDO;  
  19.       
  20.     semop(semid, sb, 1);  
  21. }  
  22.   
  23. void V(int semid, char *from)  
  24. {  
  25.     struct sembuf sb;  
  26.     sb.sem_num = 0;  
  27.     sb.sem_op = -1;  
  28.     sb.sem_flg = SEM_UNDO;  
  29.       
  30.     semop(semid, sb, 1);  
  31. }  
阅读(2027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~