信号量(Semaphore)-- 相当一个信号灯,程序里是一个非负整数,表示状态.
可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore 以及Release Semaphore 分别放置在每个关键代码段的首末端。确认这些信号量引用的是初始创建的信号量。
如果读者来:n1)无读者、写者,新读者可以读 n2)有写者等,但有其它读者正在读,则新读者也可以读 n3)有写者写,新读者等 n如果写者来: n1)无读者,新写者可以写 n2)有读者,新写者等待 n3)有其它写者,新写者等待读者: while (true) { P(mutex); readcount ++; if (readcount==1) P (w); V(mutex); 读 P(mutex); readcount --; if (readcount==0) V(w); V(mutex); };写者: while (true) { P(w); 写 V(w); };