定義:保護共用資源,使得資源在一個時刻只有一個進程(線程)擁有 原理:信號量值為正時說明空閑,若為0或負值則說明被占用 分類:內核信號量與用戶信號量,用戶信號量分為POXIS信號量和SYSTEMV信號量,POXIS信號量分為有名信號量和無名信號量 內核信號量: #include<asm/semaph ...
定義:保護共用資源,使得資源在一個時刻只有一個進程(線程)擁有
原理:信號量值為正時說明空閑,若為0或負值則說明被占用
分類:內核信號量與用戶信號量,用戶信號量分為POXIS信號量和SYSTEMV信號量,POXIS信號量分為有名信號量和無名信號量
內核信號量:
- #include<asm/semaphore.h>
- void sema_init(struct semaphore *sem, int val);
- void init_MUTEX(struct semaphore *sem); //初始值1
- void init_MUTEX_LOCKED(struct semaphore *sem); //初始值0
- void down(struct semaphore *sem); //可睡眠
- int down_interruptible(struct semaphore *sem); //可中斷
- int down_trylock(struct semaphore *sem); //m非阻塞
- void up(struct semaphore *sem);
SYSTEMV信號量:
- #include <sys/sem.h>
- int semget(key_t key, int nsems, int oflag);
- int semop(int semid, struct sembuf *opsptr, size_t nops);
- int semctl(int semid, int semum, int cmd,...);
POSIX無名信號量
- #include<semaphore.h>
- sem_t sem;
- int sem_init(sem_t *sem, int pshared, unsigned int val); //pshared為0則線程間共用,pshared為1則父子進程共用
- int sem_wait(sem_t *sem); //阻塞
- int sem_trywait(sem_t *sem); //非阻塞
- int sem_post(sem_t *sem);
- int sem_destroy(sem_t *sem);
- 進程間共用則sem必須放在共用記憶體區域(mmap, shm_open, shmget),父進程的全局變數、堆、棧中存儲是不行的
POSIX有名信號量
- sem_t *sem_open(const char *name, int oflag, mode_t mode, int val);
- int sem_wait(sem_t *sem);
- int sem_trywait(sem_t *sem);
- int sem_post(sem_t *sem);
- int sem_close(sem_t *sem);
- int sem_unlink(const char *name);
- 每個open的位置都要close和unlink,但只有最後執行的unlink生效
參考文獻:http://blog.csdn.net/qinxiongxu/article/details/7830537#comments