通过海量题库、编程比赛和实时排名,系统化提升您的编程能力。
"考研真题" 试卷中 2019年考研408计算机统考真题在线评测(附答案) 中有题目如下:
第1题
有 n(n≥3)位哲学家围坐在一张圆桌边,每位哲学家交替地就餐和思考。在 圆桌中心有 m(m≥1)个碗,每两位哲学家之间有一根筷子。每位哲学家必须取到一个碗和两 侧的筷子后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学 家同时就餐,且防止出现死锁现象,请使用信号量的 P、V 操作[wait()、signal()操作]描述上 述过程中的互斥与同步,并说明所用信号量及初值的含义。
【答案解析】 回顾传统的哲学家问题,假设餐桌上有 n 个哲学家、n 根筷子,那么可以用这种方法避免死 锁:限制至多允许 n-1 个哲学家同时“抢”筷子,那么至少会有 1 个哲学家可以获得两根筷 子并顺利进餐,于是不可能发生死锁的情况。本题可以用碗这个限制资源来避免死锁:当碗 的数量 m 小于哲学家的数量 n 时,可以直接让碗的资源量等于 m,确保不会出现所有哲学家 都拿一侧筷子而无限等待另一侧筷子进而造成死锁的情况;当碗的数量 m 大于等于哲学家的 数量 n 时,为了让碗起到同样的限制效果,我们让碗的资源量等于 n-1,这样就能保证最多只 有 n-1 个哲学家同时进餐,所以得到碗的资源量为 min{ n-1, m}。在进 PV 操作时,碗的资源 量起限制哲学家取筷子的作用,所以需要先对碗的资源量进行 P 操作。具体过程如下:
// 信号量 semaphore bowl; // 用于协调哲学家对碗的使用 semaphore chopsticks[n]; // 用于协调哲学家对筷子的使用 for(int i=0; i<n; i++) chopsticks[i]=1; // 设置两个哲学家之间筷子的数量 bowl=min(n-1,m); //bowl ≤ n-1,确保不死锁 CoBegin while(TRUE) { // 哲学家 i 的程序 思考; P(bowl); // 取碗 P(chopsticks[i]); // 取左边筷子 P(chopsticks[(i+1)%n]); // 取右边筷子 就餐; V(chopsticks[i]); V(chopsticks[(i+1)%n]); V(bowl); } CoEnd
所属试卷:2019年考研408计算机统考真题在线评测(附答案)
在银行业务中,实体客户和实体银行之间的关系是( )。
编写程序输入一个可能带空格的字符串,查找字符'z'出现
阅读程序,写出程序运行结果。
下列给定程序中,函数fun的功能是计算并输出hig
设有两行定义语句:则以下叙述正确的是( )。
下面结构体的定义语句中,错误的是( )。
有以下程序:程序的运行结果是。
若有以下程序则程序的输出结果是。
请在下面的横线处填上适当内容,以使类的定义完整。
以下程序的输出结果是。
表达式{1,2,3}&{2,3,4}的值为______
有三个关系R、S和T如下:则由关系R和S得到关系T的操
十进制整数设为整数类I,则下面属于类I的实例的是
将/home/stu目录下所有的.gz压缩文件解压缩,
在LINUX中,要查看文件内容,可使用( )命令。
如何删除一个非空子目录/tmp?
下面不属于数据库运行和维护阶段工作的是( )
按软件的功能进行划分,软件可以划分为 、 、
某些情况下,在主调函数中可以缺省对被调用函数的说明。
当a=1,b=2,c=3时,执行以下程序段后c=___
功能:用函数将第2个串连接到第1个串之后,不允许使用s
当a=1,b=2,c=3时,执行以下程序段后b=___
函数proc的功能是:根据整型形参n,计算如下公式的值
某二叉树的前序序列为ABCDEFG,中序序列为DCBA
1、“商品”与“顾客”两个实体集之间的联系一般是
与二进制小数 0.1 相等的八进进制数是 ( )。
输入:5输出:( )
输出:( )
(数字删除)下面程序的功能是将字符串中的数字字符删除后
输入: 30输出: _________
更多选择题
更多填空题
第十章 C++流
第九章 C++模板
第八章 C++运算符重载
C++语言程序设计真题5
C++语言程序设计真题4
C++语言程序设计真题3
C++语言程序设计真题2