介绍
信号量的数据结构
信号量semaphore s
包含:一个初始值为正的整数: s.count
一个初始为空的队列: s.queue
其上定义了三个原子操作:
1. 初始化s
2. semWait 操作(P操作)使信号量减1。若值为负,则执行semWait的进程被阻塞。否则进程继续执行。
3. semSignal操作(V操作)使信号量加1。若值小于或等于零,则被semWait操作阻塞的进程被解除阻塞。
物理意义
S.count为正时表示资源的个数
S.count为负时表示等待进程的个数
P操作分配资源
V操作释放资源
代码
int Rcount=0; //“正在读”的进程数,初值是0。
int Wcount=0; //“等待写”的进程数,初值是0。
semaphore r=1; //信号量,用于Rcount的互斥。
semaphore w=1; //信号量,用于Wcount的互斥。
semaphore RWmutex=1; //信号量,用于读者写者互斥。
semaphore Wmutex=1; //信号量,用于写者互斥。
**writer**
P(w);
Wcount++;
if Wcount==1 then //第一个写者进入时
P(RWmutex); //申请读写资源
V(w);
P(Wmutex);
writing;
V(Wmutex);
P(w);
Wcount--;
if Wcount==0 then
V(RWmutex); //释放读写资源
V(w);
**Reader**
P(w); //如果有写者在等待RWmutex,那么它肯定占有w,于是读者在这里会阻塞
V(w); //立即释放掉,使写者随时可申请到w
P(r);
Rcount++;
if Rcount==1 then //第一个读者进入时,
P(RWmutex); //如已有写者,其会被阻塞
V(r);
reading;
P(r);
Rcount--;
If Rcount==0 then
V(RWmutex);
V(r);