(本题 7 分)甲、乙、丙三人一起植树,甲负责挖树坑,乙负责将树苗放入树坑中并填土,丙负责为新种的树苗浇水。植树的步骤依次为:挖树坑、放树苗、填土和浇水。现有铁锹和水桶各 1 个,铁锹用于挖树坑和填土,水桶用于浇水。当树坑的数量小于 3 时,甲才可以挖树坑。假设初始时树坑的数量为 0,铁锹和水桶均可用。请定义尽可能少的信号量,用 wait ()、signal () 操作描述植树过程中三人之间的同步或互斥关系,并说明所用信号量的作用及其初值。
信号量 empty:作用是控制可挖树坑的最大数量,确保树坑总数不超过 3,以此同步甲的挖坑行为 —— 只有当已挖树坑数小于 3 时,甲才能执行挖坑操作,其初值为 3。
信号量 pit:用于表示已挖好且尚未被乙使用的树坑数量,承担甲(树坑生产者)和乙(树坑消费者)之间的同步功能 —— 甲挖好树坑后会触发该信号量,乙需等待该信号量可用才能进行放树苗操作,其初值为 0。
信号量 seedling:表示已完成放树苗和填土步骤、等待丙浇水的树苗数量,实现乙(栽种生产者)和丙(浇水消费者)之间的同步 —— 乙栽种完成后触发该信号量,丙需等待该信号量可用才能进行浇水操作,其初值为 0。
信号量 spade:用于实现铁锹的互斥使用,因为铁锹既供甲挖树坑,又供乙填土,同一时间只能由一人使用,通过该信号量避免资源竞争,其初值为 1。
甲(挖树坑)
while (true) {
wait(empty); // 检查是否允许挖树坑(树坑数<3)
wait(spade); // 申请铁锹(互斥使用)
挖树坑; // 核心操作
signal(spade); // 释放铁锹
signal(pit); // 挖好1个树坑,通知乙可使用
}乙(放树苗 + 填土)
while (true) {
wait(pit); // 等待甲挖好树坑
放树苗; // 无需竞争资源,直接执行
wait(spade); // 申请铁锹(填土用)
填土; // 核心操作
signal(spade); // 释放铁锹
signal(empty); // 树坑已使用,释放1个“可挖坑名额”
signal(seedling); // 栽种完成,通知丙可浇水
}丙(浇水)
while (true) {
wait(seedling); // 等待乙栽种好树苗
浇水; // 水桶唯一且无竞争(仅丙使用),直接执行
}