【问题标题】:Understanding critical region了解临界区
【发布时间】:2014-02-27 15:15:16
【问题描述】:

我在网上阅读了一些关于关键区域、进入协议和退出协议的示例,并且很难弄清楚。 http://pages.cs.wisc.edu/~dusseau/Classes/CS537-S01/SampleQuizzes/sol2.html

class BankAccount {

    private int turn = 0;
    private boolean lock = {true, true};
    private int balance;
    private int accountNumber;

    BankAccount(int acct) {
        accountNumber = acct;
        balance = 0;
    }

   // tellerID is either 0 or 1
   public void deposit(int amount, int tellerID) {
        lock[tellerID] = true;
        turn = 1 - tellerID;
        while (lock[1-tellerID] && turn == (1 - tellerID));
        balance += amount;
        lock[tellerID] = false;
    }
}

这个例子的入口协议、出口协议和临界区是什么? 至于临界区,是互斥、饿死还是会导致死锁?

【问题讨论】:

  • 我在想如果入口协议是lock[tellerID] = true;退出协议为 lock[tellerID] = false;临界区 while (lock[1-tellerID] && turn == (1 - tellerID));?
  • 首先,您提供的链接已经为您提供了答案,其次,如果您无法弄清楚为什么您展示的示例会导致死锁,我建议您阅读并发至少一点。第三,你复制错误的例子private boolean lock = {true, true}应该是private boolean lock[] = {true, true}
  • 你为什么不通过你所问的所有术语的定义来改进你的问题,你对这些定义如何应用于问题的解释,你认为答案是什么,也许是一个实际的问题比如“我不明白这部分是什么意思,我在谷歌上找不到答案。”
  • 当你说and had a hard time figuring out .. 我的眼睛有点呆滞。你是不是连续玩了2天?还是 2 小时?
  • 顺便说一句,只有两个出纳员 ID,所以我能想到的情况实际上只有四种。如果你真的把它们写在纸上,你会很清楚地看到这个问题。我给你一个提示 - 入口协议并不都在一行中。

标签: java deadlock mutual-exclusion


【解决方案1】:

假设我是出纳员 1。你是出纳员 0。

lock[tellerID] = true;

我为自己拿了一把锁。

turn = 1 - tellerID;

我说“现在轮到你了。”Turn 设置为其他柜员的 ID(暂时)。

whilelock[1-tellerID]

在你有锁的时候循环

whileturn == (1 - tellerID)

我也轮到你的时候循环播放

想象一下,我们都一个接一个地进入了 while 循环。我有我的锁,你有你的锁。我们都在等待对方释放锁,或者轮到我们。必须轮到你或轮到我,所以只有我们中的一个人会掉入循环中。这显然是互斥。当你再去存款时,你会通知我轮到我了。

等待、抢锁和轮流都是进入协议的一部分。释放锁是退出协议的一部分。默认情况下,介于两者之间的所有内容都是关键部分。默认情况下,外部的所有内容都是非关键部分

【讨论】:

  • 循环中的条件是 && 条件,这意味着它们都必须为真。轮到我的时候我就走,或者你一松开锁就走。所以,如果你先走,我等到你释放锁。如果我先走,你等我松开锁。轮到我或轮到你,所以我们避免“卡住”。
  • 所以这是互斥而不是死锁,因为我读到线程 0 必须等待线程 1 才能继续
  • 所以我可以说关键区域是余额+=数量;
  • @i-link 关键区域是进入和退出协议之间的所有内容。不要试图自己确定临界区域……它只会导致你在课堂上的测试失败。我可以说I LOVE PRETTY FLOWERS 是关键区域,只要它位于入口和出口协议之间。
  • 我可以说 while (lock[1-tellerID]) 总是正确的吗?导致在编码的第一部分,两个锁都设置为true?无论是在线程 1 还是 0。lock[1-0] 和 lock [1-1] 都是真的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2013-03-26
  • 2013-04-07
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多