这是否支持互斥:并发编程?
Does this uphold Mutual Exclusion: Concurrent programming?
1/算法是否支持互斥?
2/ 算法是否没有死锁,是否可能出现饥饿?
我似乎无法摆脱僵局。我相信没有互斥,因为任何客户都可以进入关键部分?
谢谢
这是一种算法,其中客户端请求服务器授予的 "lock"。
这确实是一个互斥算法。相反假设两个客户端i和j在C2
和C3
之间。 W.l.o.g,说i是第一个进入临界区的。
当i这样做时,respond = i
必然在C1
处为真。这必须发生在服务器的 Q2
。
查看服务器代码,直到Q3
失败,即直到respond == 0
,它才能再次到达Q2
。查看客户端的代码,只有当 i 离开临界区 C3
时才会发生这种情况。
这与同时在临界区中的 j 相矛盾 - Q2
只能在 i[=52 时再次到达=]离开了临界区,所以,在此之前,j不可能通过C1
.
该算法未免于饥饿。客户端 j 可能会被某些客户端 i 无限制地不合时宜地绕过。算法 是 没有死锁:只有一个临界区,如果任何线程进入它最终会退出它,那么它最终将可供另一个线程使用(尽管可能是相同的一个).
1/算法是否支持互斥?
2/ 算法是否没有死锁,是否可能出现饥饿?
我似乎无法摆脱僵局。我相信没有互斥,因为任何客户都可以进入关键部分?
谢谢
这是一种算法,其中客户端请求服务器授予的 "lock"。
这确实是一个互斥算法。相反假设两个客户端i和j在
C2
和C3
之间。 W.l.o.g,说i是第一个进入临界区的。当i这样做时,
respond = i
必然在C1
处为真。这必须发生在服务器的Q2
。查看服务器代码,直到
Q3
失败,即直到respond == 0
,它才能再次到达Q2
。查看客户端的代码,只有当 i 离开临界区C3
时才会发生这种情况。这与同时在临界区中的 j 相矛盾 -
Q2
只能在 i[=52 时再次到达=]离开了临界区,所以,在此之前,j不可能通过C1
.
该算法未免于饥饿。客户端 j 可能会被某些客户端 i 无限制地不合时宜地绕过。算法 是 没有死锁:只有一个临界区,如果任何线程进入它最终会退出它,那么它最终将可供另一个线程使用(尽管可能是相同的一个).