Multithreading 试图理解三线程Peterson';s算法
我正在尝试使Peterson的算法适用于3个线程,而不是通常的2个线程。我确实知道监视器或其他策略对于3个或更多线程来说会更好,但一开始只是简单的多线程练习,经过几个小时的调试和思考,现在已经成为一项艰巨的任务。这就是通常的算法:Multithreading 试图理解三线程Peterson';s算法,multithreading,algorithm,Multithreading,Algorithm,我正在尝试使Peterson的算法适用于3个线程,而不是通常的2个线程。我确实知道监视器或其他策略对于3个或更多线程来说会更好,但一开始只是简单的多线程练习,经过几个小时的调试和思考,现在已经成为一项艰巨的任务。这就是通常的算法: C1 = false C2 = false turn = 2 Thread1{ while (true){ C1 = true turn = 2 while (C2 == true and turn == 2)
C1 = false
C2 = false
turn = 2
Thread1{
while (true){
C1 = true
turn = 2
while (C2 == true and turn == 2){
//spin lock
}
//critical section
C1 = false
}
}
Thread2{
while (true){
C2 = true
turn = 1
while (C1 == true and turn == 1){
//spin lock
}
//critical section
C2 = false
}
}
Thread1.Start()
Thread2.Start()
C1 = false
C2 = false
C3 = false
turn = 2
Thread1{
while (true){
C1 = true
turn = 2
while ((C2 == true or C3 == true) and (turn == 2 or turn == 3)){
//spin lock
}
//critical section
C1 = false
}
}
Thread2{
while (true){
C2 = true
turn = 3
while ((C1 == true or C3 == true) and (turn == 1 or turn == 3)){
//spin lock
}
//critical section
C2 = false
}
}
Thread3{
while (true){
C3 = true
turn = 1
while ((C1 == true or C2 == true) and (turn == 1 or turn == 2)){
//spin lock
}
//critical section
C3 = false
}
}
Thread1.Start()
Thread2.Start()
Thread3.Start()
我让它在2个线程上工作没有问题,但是当我尝试添加3个线程时,一些奇怪的事情开始发生(大部分都在工作,然后突然有2个线程的活动被交错)。以下是我对三向Peterson算法的尝试:
C1 = false
C2 = false
turn = 2
Thread1{
while (true){
C1 = true
turn = 2
while (C2 == true and turn == 2){
//spin lock
}
//critical section
C1 = false
}
}
Thread2{
while (true){
C2 = true
turn = 1
while (C1 == true and turn == 1){
//spin lock
}
//critical section
C2 = false
}
}
Thread1.Start()
Thread2.Start()
C1 = false
C2 = false
C3 = false
turn = 2
Thread1{
while (true){
C1 = true
turn = 2
while ((C2 == true or C3 == true) and (turn == 2 or turn == 3)){
//spin lock
}
//critical section
C1 = false
}
}
Thread2{
while (true){
C2 = true
turn = 3
while ((C1 == true or C3 == true) and (turn == 1 or turn == 3)){
//spin lock
}
//critical section
C2 = false
}
}
Thread3{
while (true){
C3 = true
turn = 1
while ((C1 == true or C2 == true) and (turn == 1 or turn == 2)){
//spin lock
}
//critical section
C3 = false
}
}
Thread1.Start()
Thread2.Start()
Thread3.Start()
它的行为就像它是如此接近正确,但正如我开始明白的那样,在多线程中感觉“接近正确”通常意味着您离正确还有很长的路要走
我对3线程Peterson算法的假设正确吗,还是我遗漏了什么?我很难把我的头缠在它身上。非常感谢您的帮助 它看起来不像你的新的,而条件是对称的条件,你用2线程。你有
而(C2==true和turn==2)
所以我认为你应该有((C2==true和turn==2)或(C3==true和turn==3))
,至少这样看起来可以保留条件背后的逻辑。这对3个线程是否可行我真的不知道。谢谢!仍然不起作用,但我开始认为这个算法不能修改为支持3个或更多线程。因为逻辑在达到旋转锁之前改变了旋转,所以第三个线程似乎可以在另一个线程处于关键部分时改变旋转锁条件,从而允许另一个线程同时进入;它包含一个多线程版本。啊,谢谢!不知道我怎么会错过。我现在正试图把我的头绕在它周围!