同步保护方式有很多,互斥锁、读写锁、文件锁、信号量等。本文只总结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
-
#ifndef __MYSEM_H__
-
#define __MYSEM_H__
-
-
#include
-
#include
-
-
union semun
-
{
-
int val;
-
struct semid_ds *buf;
-
unsigned short *ary;
-
};
-
-
int sem_init(key_t key, int inival);
-
void P(int semid, char *from);
-
void V(int semid, char *from);
-
-
#endif
mySem.c
其中,SEM_UNDO是为了防止调用者没有释放信号量,进程没有释放已获取的信号量退出时,由操作系统恢复信号量的值。
-
#include "mySem.h"
-
-
int sem_init(key_t key, int inival)
-
{
-
int semid;
-
union semun ary;
-
semid = semget(key, 1, IPC_CREAT | 0660);
-
arg.val = inival;
-
semctl(semid, 0, SETVAL, arg);
-
return semid;
-
}
-
-
void P(int semid, char *from)
-
{
-
struct sembuf sb;
-
sb.sem_num = 0;
-
sb.sem_op = 1;
-
sb.sem_flg = SEM_UNDO;
-
-
semop(semid, sb, 1);
-
}
-
-
void V(int semid, char *from)
-
{
-
struct sembuf sb;
-
sb.sem_num = 0;
-
sb.sem_op = -1;
-
sb.sem_flg = SEM_UNDO;
-
-
semop(semid, sb, 1);
-
}
阅读(2027) | 评论(0) | 转发(0) |