rc: -rc+ V(Sr) Read file F. if rc=0 then V(S) V(Sr) end process Writer j(j=1, 2,.., k) V (S) Parend 在这个程序中,当有进程在读而使一个请求写的进程阻塞时,如果仍有进程不断地请求读 则写进程将被长期地推迟运行。但在实际的系统中往往希望让写者优先,即当有进程在读文件 时,如果有进程请求写,那么新的读者被拒绝,待现有读者完成读操作后立即让写者运行,只有 当无写者工作时才让读者工作。下面是写者优先的程序。其中信号量S,初值为1,用于读者与 写者或写者与写者之间的互斥;另一信号量Sn,初值为n,表示系统中最多有n个进程可同时进 行操作 var S, Sn: Semaphore: =l, n: process Reader i(i=1.2,., n) read file F Process Wri P(S) P(Sn) V(S) parend 其中 Process Reader i中的P(S),V(S)保证了当有写者要工作时,不让新的读者去process Reader i(i=1,2,…,m) begin P(Sr); rc:=rc+1; if rc=1 then P(S); V(Sr); Read file F; P(Sr); rc:=rc-1; if rc=O then V(S); V(Sr); end process Writer j(j=1,2,…,k) begin P(S); Write file F; V(S); end; Parend; 在这个程序中,当有进程在读而使一个请求写的进程阻塞时,如果仍有进程不断地请求读 则写进程将被长期地推迟运行。但在实际的系统中往往希望让写者优先,即当有进程在读文件 时,如果有进程请求写,那么新的读者被拒绝,待现有读者完成读操作后立即让写者运行,只有 当无写者工作时才让读者工作。下面是写者优先的程序。其中信号量 S,初值为 1,用于读者与 写者或写者与写者之间的互斥;另一信号量Sn,初值为n,表示系统中最多有n个进程可同时进 行操作: var S,Sn:Semaphore:=1,n; Parbegin process Reader i(i=1.2,…,n) begin P(S); P(Sn); V(S); read file F; V(Sn); Process Writer j(j=1,2,…,k) begin P(S); For i=1 to n do P(Sn); Write file F; for i:=1 to n do V(Sn); V(S) end parend 其中 Process Reader i 中的 P(S),V(S)保证了当有写者要工作时,不让新的读者去