您的位置:首页 > 大数据 > 人工智能

利用记录型信号量机制: wait(s), signal(s)解决进程同步问题

2018-01-05 21:34 525 查看
wait(s) 等价与P操作, signal(s)等价于V操作


生产者-消费者问题

int in = 0, out = 0;
item buffer
;
semaphore mutex = 1, empty = n, full = 0;
void procuder() {
do {
procuder an item nextp;
...
wait(empty);//表示空缓冲区-1;
wait(mutex);//数据缓冲区互斥访问,关闭访问;
buffer[in] = nextp;
in = (in+1) % n;
signal(mutex);//打开访问
signal(full);//满缓冲区加+1
} while (true);
}

void consumer() {
do {
wait(full);//判断是否有满缓冲区,满缓冲区-1
wait(mutex);
nextc = buffer[out];
out = (out+1) % n;
signal(mutex);
siganl(empty);//空缓冲区+1
consumer the item in nextc;
....
} while (true);
}

void main() {
cobegin
producer(); consumer();
coend
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34


爸爸妈妈洗水果,儿子女儿吃水果问题

问题描述:爸爸专向盘中放苹果,妈妈专向盘中放橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果。只要盘子空,爸爸妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出他们四人之间的同步关系,并用PV操作实现四人正确活动的程序。。使用p、v操作来完成父亲、妈妈、儿子、女儿的同步行为模拟。
semaphore putmutex = 1, getmutex = 0;
semaphore empty = 1, apple = 0, orange = 0;
void father() {
  do {
    wait(putmutex);
    apple++;
    empty--;
    signal(putmutex);
  } while (true);
}
void mother() {
do {
wait(putmutex);
orange++;
empty--;
signal(putmutex);
} while (true);
}
void son() {
do {
wait(getmutex);
orange--;
empty++;
signal(getmutex);
} while (true);
}
void daughter() {
do {
wait(getmutex);
apple--;
empty++;
signal(getmutex);
} while (true);
}
void main() {
cobegin
father(); mother(); son(); daughter();
coend
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

此外 ,可参考java的实现:http://www.cnblogs.com/zyp4614/p/6555530.html


司机,售票员问题

问题: 

司机开车,售票员售票。当售票员将门关上的时候司机才可以开车,当司机将车到站停下的时候,售票员才可以打开车门。

对S1(门): 门有两个状态,开和关。售票员将门关上之后,应该将门的操作权给司机(因为只有司机到站了才能停车)。因此0为门开着状态。 

对S2(车):两个状态,开车行驶和到站停车。当车开的时候,需要申请车的资源,即用wait,则车在停着的时候状态为1,行驶时状态为0. 

司机:开车,正常行驶,到站停车 

售票员:关门,售票,开门

**S1表示是否允许司机启动汽车;S1 = 1表示可以启动,S2 = 0表示不能启动。 

S2表示是否允许售票员关车门;S2 = 1表示允许售票员关车门,S2 = 0表示不允许售票员关车门。**
semaphore s1 = 1, s2 = 0;
void driver() {
do {
wait(s1);// P(S1)
开车;
正常行驶;
到站停车;
signal(s2);//V(S2)
} while (true);
}
void seller() {
do {
关门;
signal(s1);// V(S1)
售票;
wait(S2);//P(S2)
开车门;
上下乘客;
} while (true);
}
void main() {
cobegin
driver(); seller();
coend
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: