- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习操作系统类(class)。两周后我们有考试,我怀疑里面有用餐哲学家和 sleep 理发师问题(信号量版本)。现在,如果我愿意,我可以打开教科书,然后用勺子把答案塞给我,但我宁愿自己去学。我花了一些时间来解决这些问题,我想我已经接近了,但是……我不确定。我不想只是被告知我的解决方案到底出了什么问题,但我想要提示。我想尽可能自己弄清楚。
所以, sleep 的理发师...在我制定的解决方案中,我有三个二进制信号量:'w' 代表等候室,'c' 代表理发师的椅子,'x' 代表导出。理发师一次可以照顾一个顾客,等完了再去候诊室里找其他顾客,如果没有就 sleep ,对吧?这是我为 barber 进程的代码(有点像 C 和伪代码的混合体)制定的:
while(true)
{
P(w); //Guarantees an entering customer can't check the waiting room before the barber.
P(c);
P(x); //A customer being serviced can't leave until barber is done servicing him.
while( customersWaiting > 0 )
{
V(c); //Allow a waiting room customer to sit in barber's chair.
V(w); //Allow another customer to enter the waiting room
service customer
V(x); //Allow customer to leave
P(w); //Lock waiting room so barber can check it.
}
//No customers
V(w); //Allow next entering customer to check waiting room.
sleep
V(c); //Allows new customer service.
service customer
V(x); //Allow customer to leave.
}
我认为这是正确的,但我不确定。我觉得刚进来的客户应该由 while(customersWaiting > 0) 循环中的代码处理,但我不知道如何安排信号量来完成这项工作。
顾客,如果我理解的话,必须检查一下椅子是否有人。如果是,他必须看看是不是里面的理发师。如果是,我叫醒他,否则他就坐在候诊室里。如果等候室满了,他就离开,对吧?无论如何,这是我为客户流程制定的代码:
P(w); //Guarantees neither barber nor other customers can check waiting room.
if (chair is occupied) //Could you write this as if(c), or would you create a separate flag?
{
if (barber is sleeping)
{
wakeup barber
V(w); //Now the waiting room can be checked by someone else.
P(c); //Sit in barber's chair
P(x); //Attempt to exit shop
}
}
else
{
if (customersWaiting < amountOfChairs)
{
customersWaiting++;
V(w); //Now the waiting room can be checked by someone else.
P(c); //Sit in barber's chair, when it's available that is.
P(x); //Attempt to exit shop
customersWaiting--;
}
}
exit shop
我不确定我是否在正确的轨道上......我看到的问题是,当没有顾客时,理发师会去 sleep ,但他可能不会一直睡着当有新顾客到来时,顾客就会去等候室永远等他。我想到了几种可能的方法来解决这个问题......我可以让理发师在他 sleep 前设置一个标志(使用信号量访问它),然后新客户可以检查它,然后坐在紧密循环,直到理发师完全睡着,然后把他叫醒……但这并不是最好的解决办法,不是吗?我对此不确定......有什么提示吗?同样,我不想要直截了当的答案,我想要提示。
现在哲学家就餐问题......我对这个问题更有信心了,但我仍然想仔细检查一下。在我已经制定的解决方案中,我有一个二进制信号量“g”用于捕获一双筷子,一个计数信号量“a”用于可能开始进食的哲学家数量,以及一个二进制信号量 c[0..n -1] 每根筷子。基本上,一半的哲学家(当然是四舍五入)可能会在任何时候吃东西,对吧? (当然四舍五入)所以在我的解决方案中,哲学家在他的思考完成后试图拿起一双筷子筷子,但前提是只有不到一半的哲学家在吃饭并且没有其他人试图拿起筷子。我把哲学家的代码编码成这样:
while(true)
{
think
P(g); //Above all, no one else can try to grab a chopstick at the same time as someone else.
P(a); //Decrement the amount of philosophers that may start eating.
P(c[left chopstick's number]);
take left chopstick
P(c[right chopstick's number]);
take right chopstick
V(g); //Now someone else may attempt to grab a pair.
eat
V(c[left chopstick's number]);
replace left chopstick
V(c[right chopstick's number]);
replace right chopstick
V(a);
我能看到的一个问题是,如果一个哲学家正在吃饭,而他旁边的人试图拿起一双筷子,他将无法得到一双完整的筷子,因此每个人都会被卡住,直到当前吃完了。我走在正确的轨道上了吗?
如果有任何反馈,我将不胜感激!
真诚的,红区
最佳答案
Dining philosophers 是一个通过锁顺序解决的经典死锁问题(我相信这在你的书中,尝试代码很好,但最好先有基础)
1 o 2 o o 4 o 3
您可以对大多数死锁问题应用相同的逻辑。这类问题的重点不是如何编写解决方案,而是识别它说明的问题(死锁、资源匮乏)、解决方案,然后将解决方案应用于此类其他更普遍的问题(在具有锁A、B、C,如何保证在尝试获取多个锁的线程之间不会出现死锁(其中筷子是锁的比喻,哲学家是线程或进程的比喻)。
关于multithreading - 关于我 sleep 的理发师和用餐的哲学家算法正确性的提示(不是答案)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5364084/
我的 friend 编写了一个程序,它比较随机排列的骰子面,以找到分布最均匀的面——尤其是当面不仅仅是序列时。 我将他的程序翻译成 haskell 是因为我一直在寻找一个理由来让别人知道 haskel
我需要对表单中的某些字段进行评论/提示。我的想法是在模型中描述它,就像attributeLabels一样。我该怎么做? 然后它会是理想的,如果 Gii 模型(和 Crud)生成器直接从 mysql 列
我们使用 FastReport 来生成报告。事实上,我们为访问源代码付费。 我们目前使用的是 FastReport 的最新稳定版本。虽然它对于我们的生产来说足够稳定,但每当我编译时,我都会看到以下内容
我需要创建一个对话框/提示,包括用于用户输入的文本框。我的问题是,确认对话框后如何获取文本?通常我会为此创建一个类,将文本保存在属性中。不过我想使用 XAML 设计对话框。因此,我必须以某种方式扩展
我想提示用户是否要执行操作(删除) - 用警报框说"is"或“否”,如果是,则运行删除脚本,如果否,则不执行任何操作 我不太了解 javascript,因此是否有人可以使用 javascript 获得
所以我正在编写一个简单的 JS 代码。我们刚刚开始学习函数。我需要创建一个名为“printStars”的函数。 我需要从用户那里获取一个号码,并根据该号码打印“*”。 这就是我所做的:
我在我的页面上添加了一个提示,但它在页面加载之前加载了。如何仅在整个页面可见时才显示消息? 这是我的提示: if (name == null || name == "") { txt == "No
我在我的页面上添加了一个提示,但它在页面加载之前加载了。如何仅在整个页面可见时才显示消息? 这是我的提示: if (name == null || name == "") { txt == "No
我正在自定义我的 zsh 提示,并发现以下内容来检查是否有任何后台作业: if [[ $(jobs | wc -l) -gt 0 ]]; then # has background job(s)
这个问题在这里已经有了答案: JavaScript object: access variable property by name as string [duplicate] (3 个答案) pa
我正在尝试用 javascript 制作一个简单的数学练习程序。在提示警报中给出不同的值,并将答案与用户输入进行比较。这是代码: Calculations generate(); functio
在这段代码中,尽管我使用了文本对齐属性在“编辑文本” View 的中心设置“提示”。但它无法正常工作。 最佳答案 尝试 关于android - 如何在编辑文本的中心对齐文本(提示),我们在Sta
我正在尝试让我的 EditText 显示一个提示,例如“请在此处输入答案”,当用户点击 EditText 以键入他们的答案时,文本应该消失并留空,以便他们在其中输入答案. 截至目前,这就是我的 .xm
我当前的 android 应用程序中有两个微调器,我想要一个默认值,例如 editText 的 android:hint 功能。有没有办法这样做,但不会将提示添加到填充微调器的字符串数组。例如从微调器
如果我的表单已完全填写,我如何提示“感谢您填写表单,“name”!” function submit_onclick() { if(confirm("Thanks for completing t
我刚刚了解了prompt()命令;我知道 Prompt() 命令以字符串的形式返回用户输入。我正在搞乱下面的程序,我输入了Per“Dead”Ohlin作为男性名字。为什么这有效并且没有引起任何问题?
void openUpNow(FILE *x, FILE *y) { x = fopen("xwhatever", "r"); y = fopen("ywhatever", "r");
我有一个作业正在处理,但我在使用 prompt() 方法时遇到了问题。我看到我可以做一个提示,但我需要几个并且有数量。 例如... 我创建了一个 HTML 表格,其中包含许多艺术家和包含 DVD、CD
我正在学习 Big Nerd Ranch 的 iOS Programming, 2nd Edition,我已经来到第 4 章挑战:标题。该练习暗示我感到困惑;它说我需要做一些我认为不需要做的事情。 到
抱歉,如果这是微不足道的,但我没有找到任何解决此问题的建议。我在 Ubuntu 上,我的 Yii 项目需要 PHPUnit。我已经安装了 PHPUnit 两次,方法是下载 phpunit.phar 并
我是一名优秀的程序员,十分优秀!