all problems documented

This commit is contained in:
Johannes Theiner 2020-03-11 13:31:57 +01:00
parent 37568c556c
commit 0f969e4355
6 changed files with 41 additions and 15 deletions

View File

@ -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]
}

View File

@ -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)

View File

@ -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

View File

@ -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
}
*/
goto A1
@ -68,10 +73,12 @@ L2:
c2 = 1
controller.OutsideCriticalSection(2, 100)
/*
if controller.ProcessCrashed(0.1) {
log.Println("Process 2 crashed")
return
}
*/
goto A2
}

View File

@ -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
}

View File

@ -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
}