这个算法是免费的吗?

时间:2017-06-02 18:45:16

标签: java multithreading algorithm concurrency

我偶然发现了Bakerys算法的修改版本(当然是一个有缺陷的不完整版本)

我在课堂上被问到以下算法是否会出现饥饿问题:

while(true){
    number[me] = max(number[0],...,number[n]) + 1
    for (other from 0 to n) {
        while(number[other] != 0 && number[other] < number[me]) {
            // Wait
        }
    }

    /*CS*/
    number[me] = 0
}

我知道死锁是可能的,但是我问这个算法是否没有饥饿?

我认为是这样,因为我可以保证一旦thread A选择了一个号码,其他线程总会有一个比thread A更大的号码,因此他最终会被允许进入CS

我的朋友认为该算法不是免费的,因为线程可能会在获取数字(计算max)的过程中卡住,并可能从他那里获取CPU时间。与此同时,其他线程将启动&amp;完成并且可能重新开始(因为时间是真的),而据说thread A正在被饿死。

我的问题可以简化为: 原始Bakerys算法中的choosing数组是否解决了饥饿问题?

1 个答案:

答案 0 :(得分:3)

饥饿自由可以定义为:任何尝试进入关键部分的进程最终都会进入关键部分。

计算max的行不是关键部分的一部分,因此最终将获得cpu时间来进行分配。

process A收到id时,它会等待id低于其id的所有其他进程(较低的ID表示优先级较高) 。有时,流程将离开关键部分,并将获得新的process A。此ID将大于它所拥有的ID,并且在那一刻aside将进入关键部分。

最后,算法没有饥饿。