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)