临界资源:多个进程/线程访问资源。
互斥:在同一时间只有并仅有一个进程/线程访问临界资源
信号量:
posix:
无名信号量 线程
int sem_init(sem_t *sem, int pshared, unsigned int value)
初始化信号量
sem:创建信号量
pshared: !0=进程间使用 0=线程使用
value:信号量初值 2
int sem_wait(sem_t *sem)
lock value=value-1
临界资源操作
int sem_post(sem_t *sem)
unlock value=value+1
int sem_unlink(const char *name)
有名信号量:
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
mode_t mode, unsigned int value)
int sem_wait(sem_t *sem)//上锁
lock value=value-1
临界资源操作
int sem_post(sem_t *sem)//解锁
unlock value=value+1
int sem_unlink(const char *name)
system V:
int semget(key_t key, int nsems, int semflg)
创建信号量集
key:名称
nsems:信号量集中信号量的个数
semflg:属性IPC_CREAT IPC_EXCL
int semop(int semid, struct sembuf *sops, unsigned nsops)
操作信号量 lock unlock
semid:semget()返回值
sops:
struct sembuf
{
unsigned short sem_num; //0~(nsems-1)
short sem_op; //-1 +1
short sem_flg; /* operation flags */SEM_UNDO
}
nsops:
int semctl(int semid, int semnum, int cmd, ...)
获取/设置信号量集中某个信号量属性
semid:
semnum:
cmd:SETVAL(初值) GETVAL IPC_RMID
阅读(1735) | 评论(0) | 转发(0) |