Dotcpp   >   考研真题   >   题目 7694

(本题 7 分)甲、乙、丙三人一起植树,甲负责挖树坑,乙负责将树苗放入树坑中并填土,丙负责为新种的树苗浇水。植树的步骤依次为:挖树坑、放树苗、填土和浇水。现有铁锹和水桶各 1 个,铁锹用于挖树坑和填土,水桶用于浇水。当树坑的数量小于 3 时,甲才可以挖树坑。假设初始时树坑的数量为 0,铁锹和水桶均可用。请定义尽可能少的信号量,用 wait ()、signal () 操作描述植树过程中三人之间的同步或互斥关系,并说明所用信号量的作用及其初值。

(本题 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);    // 等待乙栽种好树苗
    浇水;              // 水桶唯一且无竞争(仅丙使用),直接执行
}

题目信息

题号:7694
题型:简答题
知识点:考研真题
难度:普通
0.044650s