all problems documented
This commit is contained in:
parent
37568c556c
commit
0f969e4355
|
@ -32,7 +32,7 @@ func main() {
|
||||||
|
|
||||||
log.Printf("*** Start\n")
|
log.Printf("*** Start\n")
|
||||||
|
|
||||||
var variant = "dekker"
|
var variant = "a"
|
||||||
if len(os.Args[1:]) > 0 { // do we have arguments?
|
if len(os.Args[1:]) > 0 { // do we have arguments?
|
||||||
variant = os.Args[1]
|
variant = os.Args[1]
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,11 +25,18 @@ var turn = 1
|
||||||
func Start() {
|
func Start() {
|
||||||
go process1()
|
go process1()
|
||||||
go process2()
|
go process2()
|
||||||
|
/**
|
||||||
|
|
||||||
|
|
||||||
|
Prozesse wechseln sich immer nur ab.
|
||||||
|
Ablauf ist 1,2,1,2,1,2,1,2,1,2
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// process1 simulates the behaviour of the first process
|
// process1 simulates the behaviour of the first process
|
||||||
func process1() {
|
func process1() {
|
||||||
L1:
|
L1:
|
||||||
|
//wait till turn = 2 (program can run)
|
||||||
if turn == 2 {
|
if turn == 2 {
|
||||||
//log.Printf("Process 1 waiting\n")
|
//log.Printf("Process 1 waiting\n")
|
||||||
goto L1
|
goto L1
|
||||||
|
@ -40,6 +47,7 @@ L1:
|
||||||
controller.LeaveCriticalSection(1)
|
controller.LeaveCriticalSection(1)
|
||||||
|
|
||||||
turn = 2
|
turn = 2
|
||||||
|
//Process 2 can run now (and will in some cases)
|
||||||
|
|
||||||
controller.OutsideCriticalSection(1, 100)
|
controller.OutsideCriticalSection(1, 100)
|
||||||
|
|
||||||
|
@ -64,6 +72,7 @@ L2:
|
||||||
controller.LeaveCriticalSection(2)
|
controller.LeaveCriticalSection(2)
|
||||||
|
|
||||||
turn = 1
|
turn = 1
|
||||||
|
//Process can run now (and will in some cases)
|
||||||
|
|
||||||
controller.OutsideCriticalSection(2, 100)
|
controller.OutsideCriticalSection(2, 100)
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ package ewd123b
|
||||||
import (
|
import (
|
||||||
"../controller"
|
"../controller"
|
||||||
"log"
|
"log"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// global synchronization variables
|
// global synchronization variables
|
||||||
|
@ -25,14 +26,21 @@ var c1, c2 = 1, 1
|
||||||
func Start() {
|
func Start() {
|
||||||
go process1()
|
go process1()
|
||||||
go process2()
|
go process2()
|
||||||
|
/**
|
||||||
|
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// process1 simulates the behaviour of the first process
|
// process1 simulates the behaviour of the first process
|
||||||
func process1() {
|
func process1() {
|
||||||
L1:
|
L1:
|
||||||
|
//wait till c2 = 0 (other process no longer inside critical section)
|
||||||
if c2 == 0 {
|
if c2 == 0 {
|
||||||
goto L1
|
goto L1
|
||||||
}
|
}
|
||||||
|
//if the other process inspects c1 at this moment both will enter the critical section
|
||||||
|
//we can force this behaviour if we wait for a moment
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|
||||||
c1 = 0
|
c1 = 0
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ package ewd123c
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"../controller"
|
"../controller"
|
||||||
"log"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// global synchronization variables
|
// global synchronization variables
|
||||||
|
@ -32,6 +32,9 @@ func process1() {
|
||||||
A1:
|
A1:
|
||||||
c1 = 0
|
c1 = 0
|
||||||
L1:
|
L1:
|
||||||
|
//if process 2 inspects c1 at this moment, both processes will wait for each other to set cX.
|
||||||
|
//we can force this behavior if we wait for a moment
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
if c2 == 0 {
|
if c2 == 0 {
|
||||||
goto L1
|
goto L1
|
||||||
}
|
}
|
||||||
|
@ -43,10 +46,12 @@ L1:
|
||||||
c1 = 1
|
c1 = 1
|
||||||
controller.OutsideCriticalSection(1, 100)
|
controller.OutsideCriticalSection(1, 100)
|
||||||
|
|
||||||
if controller.ProcessCrashed(0.1) {
|
/*
|
||||||
log.Println("Process 1 crashed")
|
if controller.ProcessCrashed(0.1) {
|
||||||
return
|
log.Println("Process 1 crashed")
|
||||||
}
|
return
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
goto A1
|
goto A1
|
||||||
|
|
||||||
|
@ -68,10 +73,12 @@ L2:
|
||||||
c2 = 1
|
c2 = 1
|
||||||
controller.OutsideCriticalSection(2, 100)
|
controller.OutsideCriticalSection(2, 100)
|
||||||
|
|
||||||
if controller.ProcessCrashed(0.1) {
|
/*
|
||||||
log.Println("Process 2 crashed")
|
if controller.ProcessCrashed(0.1) {
|
||||||
return
|
log.Println("Process 2 crashed")
|
||||||
}
|
return
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
goto A2
|
goto A2
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ package ewd123d
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"../controller"
|
"../controller"
|
||||||
"log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// global synchronization variables
|
// global synchronization variables
|
||||||
|
@ -32,6 +31,8 @@ func process1() {
|
||||||
L1:
|
L1:
|
||||||
c1 = 0
|
c1 = 0
|
||||||
if c2 == 0 {
|
if c2 == 0 {
|
||||||
|
//when both processes are at this stage, they will wait for each other to clear this area
|
||||||
|
//for this to happen the processes need to be executed at exactly the same time.
|
||||||
c1 = 1
|
c1 = 1
|
||||||
goto L1
|
goto L1
|
||||||
}
|
}
|
||||||
|
@ -44,10 +45,10 @@ L1:
|
||||||
|
|
||||||
controller.OutsideCriticalSection(1, 100)
|
controller.OutsideCriticalSection(1, 100)
|
||||||
|
|
||||||
if controller.ProcessCrashed(0.1) {
|
/*if controller.ProcessCrashed(0.1) {
|
||||||
log.Println("Process 1 crashed")
|
log.Println("Process 1 crashed")
|
||||||
return
|
return
|
||||||
}
|
}*/
|
||||||
|
|
||||||
goto L1
|
goto L1
|
||||||
}
|
}
|
||||||
|
@ -69,10 +70,10 @@ L2:
|
||||||
|
|
||||||
controller.OutsideCriticalSection(2, 100)
|
controller.OutsideCriticalSection(2, 100)
|
||||||
|
|
||||||
if controller.ProcessCrashed(0.1) {
|
/*if controller.ProcessCrashed(0.1) {
|
||||||
log.Println("Process 2 crashed")
|
log.Println("Process 2 crashed")
|
||||||
return
|
return
|
||||||
}
|
}*/
|
||||||
|
|
||||||
goto L2
|
goto L2
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ A1:
|
||||||
c1 = 0
|
c1 = 0
|
||||||
L1:
|
L1:
|
||||||
if c2 == 0 {
|
if c2 == 0 {
|
||||||
|
//if both processes are stuck here, the turn variable will decide which process runs first
|
||||||
if turn == 1 {
|
if turn == 1 {
|
||||||
goto L1
|
goto L1
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue