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") 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]
} }

View File

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

View File

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

View File

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

View File

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

View File

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