From 6d6db0ed288ea69694fc4f425b6c9ec0ec0652aa Mon Sep 17 00:00:00 2001 From: Sacha Ligthert Date: Sat, 25 Jan 2025 19:08:31 +0100 Subject: [PATCH] #9 Make use of the Atomic package to keep track of `solver.counter`. --- solver/processing.go | 15 ++++++++------- solver/types.go | 4 +++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/solver/processing.go b/solver/processing.go index 0ede498..ea5fa16 100644 --- a/solver/processing.go +++ b/solver/processing.go @@ -85,7 +85,8 @@ func (solver *Solver) check_combinations() { func (solver *Solver) routine_validator(rows1_index int, rows2_index int, rows3_index int, rows4_index int, rows5_index int, rows6_index int, rows7_index int, rows8_index int, rows9_index int) { - solver.counter = solver.counter + 1 + // solver.counter = solver.counter + 1 + solver.counter.Add(1) if solver.validate_combination(solver.row1s[rows1_index], solver.row2s[rows2_index], solver.row3s[rows3_index], solver.row4s[rows4_index], solver.row5s[rows5_index], solver.row6s[rows6_index], solver.row7s[rows7_index], solver.row8s[rows8_index], solver.row9s[rows9_index]) { solver.solutions = append(solver.solutions, solver.render_combination(solver.row1s[rows1_index], solver.row2s[rows2_index], solver.row3s[rows3_index], solver.row4s[rows4_index], solver.row5s[rows5_index], solver.row6s[rows6_index], solver.row7s[rows7_index], solver.row8s[rows8_index], solver.row9s[rows9_index])) @@ -123,17 +124,17 @@ func (solver *Solver) tracker() { for !done { // Determine how far we are. - percentage = (float32(solver.counter) / (float32(solver.iter) / 100)) + percentage = (float32(solver.counter.Load()) / (float32(solver.iter) / 100)) // Reset the loop - rate_diff = solver.counter - rate_start + rate_diff = solver.counter.Load() - rate_start if track <= int(percentage) || rate_diff == 0 { // Start if-statement // Make sure something happened, making rate_start the only reliable variable if rate_diff == 0 { percentage = 100 - solver.counter = solver.iter + solver.counter.Store(solver.iter) done = true } @@ -145,11 +146,11 @@ func (solver *Solver) tracker() { if rate_diff == 0 { est_fin = "N/A" } else { - est_fin = solver.secondsToHuman((solver.iter - solver.counter) / rate_avg) + est_fin = solver.secondsToHuman((solver.iter - solver.counter.Load()) / rate_avg) } // Printing the progress - log.Println("Processing: " + strconv.Itoa(int(percentage)) + "% (" + strconv.Itoa(int(solver.counter)) + "/" + strconv.Itoa(int(solver.iter)) + "); Rate: " + strconv.FormatInt(rate_diff, 10) + "/sec for " + timer_elapsed.String() + "; Time left (est.): " + est_fin) + log.Println("Processing: " + strconv.Itoa(int(percentage)) + "% (" + strconv.FormatInt(solver.counter.Load(), 10) + "/" + strconv.Itoa(int(solver.iter)) + "); Rate: " + strconv.FormatInt(rate_diff, 10) + "/sec for " + timer_elapsed.String() + "; Time left (est.): " + est_fin) // After we are done printing, exit this for-loop if percentage == 100 { @@ -168,7 +169,7 @@ func (solver *Solver) tracker() { } // Resert the rate counter - rate_start = solver.counter + rate_start = solver.counter.Load() // Sleep for a second time.Sleep(1 * time.Second) diff --git a/solver/types.go b/solver/types.go index c7423c6..649efa9 100644 --- a/solver/types.go +++ b/solver/types.go @@ -1,5 +1,7 @@ package solver +import "sync/atomic" + type Solver struct { blocks []int row1 string @@ -21,7 +23,7 @@ type Solver struct { row8s []int row9s []int iter int64 - counter int64 + counter atomic.Int64 solutions []string rates []int64 }