1 经典进程互斥与同步问题:
2
3 1。生产者|消费者问题
4 多个进程写数据到缓冲区-生产
5 一个进程从缓冲区读数据-消费
6 假设缓冲区大小为n、有两个指针:in,out
7
8 不控制生产者/消费者:出错、执行结果不确定。
9
10 生产者/消费者必须互斥:
11 生产者/消费者必须同步:
12
13 //program producer_consumer
14 int const sizeofbuffer;
15 var s: semaphore = 1; //互斥信号量
16 n: semaphore = 0; //资源信号量
17 e: semaphore = sizeofbuffer; //空储存单元
18
19 //procedure producer
20 producer(){
21 <产生一条数据>;
22 wait(e);
23 wait(s);
24 <存入一条数据>;
25 signal(s);
26 signal(n);
27 }
28 //procedure consumer
29 consumer(){
30 wait(n);
31 wait(s);
32 <取一条数据>;
33 signal(s);
34 signal(e);
35 }
36 //主程序
37 main(){
38 producer();
39 consumer();
40 }
41 注意:先申请资源信号量,再申请互斥信号量。
42 wait-signal必须嵌套配对使用。
43 wait-signal可以不在同一进程中。
44
45 2。读者|作着问题
46 多进程访问一个共享数据区。
47 :多个读者进程可以同时读数据。
48 :不容许多个写者进程同时写数据。
49 :写者不能与读者同时进行。
50
51 (1)读者优先:
52 //program readers_writers
53 const int readcount;
54 var readcount_s:semaphore = 1;//互斥信号量,用于修改读者数
55 write_s: semaphore = 1;//互斥信号量,互斥写者和其他读者
56
57 reader(){
58 wait(readcount_s);
59 readcount += 1;
60 if(readcount == 1)
61 wait(writer_s);
62 signal(readcount_s);
63
64 <读数据>;
65
66 wait(readcount_s);
67 readcount -= 1;
68 if(readcount == 0)
69 signal(writer_s);
70 signal(readcount_s);
71 }
72
73 writer(){
74 wait(write_s);
75 <写数据>;
76 signal(write_s);
77 }
78
79 //主程序
80 main(){
81 readcount = 0;
82 reader();
83 write();
84 }
85 (2)写者优先:
86 //program readers_writers
87 const int readcount;
88 var readcount_s:semaphore = 1;//互斥信号量,用于修改读者数
89 write_s: semaphore = 1;//互斥信号量,互斥写者和其他读者
90 writer(){
91 wait(writecount_s);
92 writecount += 1;
93 if(writecount == 1)
94 wait(reader_all_s);
95 signal(writecount_s);
96
97 wait(writer_s);
98 <写数据>;
99 signal(writer_s);
100
101 wait(writecount_s);
102 writecount -= 1;
103 if(writecount == 0)
104 signal(reader_all_s);
105 signal(writecount_s);
106 }
107
108 read(){
109 wait(reader_back_writer_s);//阻塞排在writer后面的reader
110 wait(reader_before_writer_s);
111 wait(readcount_s);
112 readcount += 1;
113 if(readcount == 1)
114 wait(writer_s);
115 signal(readcount_s);
116 siganl(reader_before_writer_s);
117 siganl(reader_back_writer_s);
118
119 <读数据>;
120
121 wait(readcount_s);
122 readcount -= 1;
123 if(readcount == 0)
124 signal(writer_s);
125 signal(readcount_s);
126
127 }
128 3。哲学家进餐问题