T45 猴子过河的同步互斥问题
问题描述:峡谷南北两岸之间有一根绳子,猴子们只要朝着同一个方向,同时就能通过多只猴子,但如果有猴子朝相反方向过河,就会发生死锁。
- 这个题类似于读者、写者问题,位于绳子上的猴子的数量不能用信号量表示,而是要用计数器表示,并在写操作时加锁保护。
int S_monkey=0; // 南岸猴子计数器
int N_monkey=0; // 北岸猴子计数器
semaphore S_mutex=1, N_mutex=1, R_mutex=1; // 计数器读写互斥,绳子互斥- 猴子进入绳子:
P(S_mutex),S_monkey++,V(S_mutex)- 第一只猴子请求绳子 (放在临界区内,自增前):
if (S_monkey==0) P(R_mutex)
- 第一只猴子请求绳子 (放在临界区内,自增前):
- 猴子过峡谷
- 猴子离开绳子:
P(S_mutex),S_monkey--,V(S_mutex) - 最后一只猴子释放绳子 (放在临界区内,自减后):
if (S_monkey==0) V(R_mutex)