diff --git a/EWD123/ewd123.go b/EWD123/ewd123.go index a90b288..86d0004 100644 --- a/EWD123/ewd123.go +++ b/EWD123/ewd123.go @@ -32,7 +32,7 @@ func main() { log.Printf("*** Start\n") - var variant = "dekker" + var variant = "a" if len(os.Args[1:]) > 0 { // do we have arguments? variant = os.Args[1] } diff --git a/EWD123/ewd123a/ewd123a.go b/EWD123/ewd123a/ewd123a.go index e6084c6..a748bbc 100644 --- a/EWD123/ewd123a/ewd123a.go +++ b/EWD123/ewd123a/ewd123a.go @@ -25,11 +25,18 @@ var turn = 1 func Start() { go process1() 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 func process1() { L1: + //wait till turn = 2 (program can run) if turn == 2 { //log.Printf("Process 1 waiting\n") goto L1 @@ -40,6 +47,7 @@ L1: controller.LeaveCriticalSection(1) turn = 2 + //Process 2 can run now (and will in some cases) controller.OutsideCriticalSection(1, 100) @@ -64,6 +72,7 @@ L2: controller.LeaveCriticalSection(2) turn = 1 + //Process can run now (and will in some cases) controller.OutsideCriticalSection(2, 100) diff --git a/EWD123/ewd123b/ewd123b.go b/EWD123/ewd123b/ewd123b.go index d6bbdf7..8714b07 100644 --- a/EWD123/ewd123b/ewd123b.go +++ b/EWD123/ewd123b/ewd123b.go @@ -16,6 +16,7 @@ package ewd123b import ( "../controller" "log" + "time" ) // global synchronization variables @@ -25,14 +26,21 @@ var c1, c2 = 1, 1 func Start() { go process1() go process2() + /** + + */ } // process1 simulates the behaviour of the first process func process1() { L1: + //wait till c2 = 0 (other process no longer inside critical section) if c2 == 0 { 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 diff --git a/EWD123/ewd123c/ewd123c.go b/EWD123/ewd123c/ewd123c.go index f19d42a..4621eac 100644 --- a/EWD123/ewd123c/ewd123c.go +++ b/EWD123/ewd123c/ewd123c.go @@ -15,7 +15,7 @@ package ewd123c import ( "../controller" - "log" + "time" ) // global synchronization variables @@ -32,6 +32,9 @@ func process1() { A1: c1 = 0 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 { goto L1 } @@ -43,10 +46,12 @@ L1: c1 = 1 controller.OutsideCriticalSection(1, 100) - if controller.ProcessCrashed(0.1) { - log.Println("Process 1 crashed") - return - } + /* + if controller.ProcessCrashed(0.1) { + log.Println("Process 1 crashed") + return + } + */ goto A1 @@ -68,10 +73,12 @@ L2: c2 = 1 controller.OutsideCriticalSection(2, 100) - if controller.ProcessCrashed(0.1) { - log.Println("Process 2 crashed") - return - } + /* + if controller.ProcessCrashed(0.1) { + log.Println("Process 2 crashed") + return + } + */ goto A2 } diff --git a/EWD123/ewd123d/ewd123d.go b/EWD123/ewd123d/ewd123d.go index 5fee576..98a9006 100644 --- a/EWD123/ewd123d/ewd123d.go +++ b/EWD123/ewd123d/ewd123d.go @@ -15,7 +15,6 @@ package ewd123d import ( "../controller" - "log" ) // global synchronization variables @@ -32,6 +31,8 @@ func process1() { L1: c1 = 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 goto L1 } @@ -44,10 +45,10 @@ L1: controller.OutsideCriticalSection(1, 100) - if controller.ProcessCrashed(0.1) { + /*if controller.ProcessCrashed(0.1) { log.Println("Process 1 crashed") return - } + }*/ goto L1 } @@ -69,10 +70,10 @@ L2: controller.OutsideCriticalSection(2, 100) - if controller.ProcessCrashed(0.1) { + /*if controller.ProcessCrashed(0.1) { log.Println("Process 2 crashed") return - } + }*/ goto L2 } diff --git a/EWD123/ewd123dekker/ewd123dekker.go b/EWD123/ewd123dekker/ewd123dekker.go index fd24442..1d3fc25 100644 --- a/EWD123/ewd123dekker/ewd123dekker.go +++ b/EWD123/ewd123dekker/ewd123dekker.go @@ -34,6 +34,7 @@ A1: c1 = 0 L1: if c2 == 0 { + //if both processes are stuck here, the turn variable will decide which process runs first if turn == 1 { goto L1 }