Race condition resolved mit mutex lock

This commit is contained in:
any
2026-05-10 15:46:59 +02:00
parent 22ca47cfd7
commit a64ba74e38
+25 -12
View File
@@ -1,12 +1,13 @@
package main package main
import ( import (
"sync"
"time" "time"
rl "github.com/gen2brain/raylib-go/raylib" rl "github.com/gen2brain/raylib-go/raylib"
) )
const MAXPOINTS = 100 const MAXPOINTS = 100000
func spawnParticlesAsGrid(particleWidth float32, particleHeight float32, particleColumnCount int, particleRowCount int, particleList *[MAXPOINTS]rl.Vector2) { func spawnParticlesAsGrid(particleWidth float32, particleHeight float32, particleColumnCount int, particleRowCount int, particleList *[MAXPOINTS]rl.Vector2) {
var particleLeftCornerPos rl.Vector2 = rl.Vector2{500, 300} var particleLeftCornerPos rl.Vector2 = rl.Vector2{500, 300}
@@ -19,31 +20,35 @@ func spawnParticlesAsGrid(particleWidth float32, particleHeight float32, particl
} }
} }
func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int) { func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleListKey *sync.Mutex) {
var particleSpeed rl.Vector2 = rl.Vector2{0, -300} //pixel pro Sekunde var particleSpeed rl.Vector2 = rl.Vector2{0, -300} //pixel pro Sekunde
var timeIncrement float32 = 0.001 var timeIncrement float64 = 0.0001
var gravity rl.Vector2 = rl.Vector2{0, 150} var gravity rl.Vector2 = rl.Vector2{0, 150}
for j := float32(0); j < 5; { for j := float64(0); j < 5; {
var startTime time.Time = time.Now() var startTime time.Time = time.Now()
particleListKey.Lock()
for i := 0; i < particleCount; i++ { for i := 0; i < particleCount; i++ {
particleList[i] = particleList[i] =
rl.Vector2Add( rl.Vector2Add(
particleList[i], particleList[i],
rl.Vector2Scale(particleSpeed, timeIncrement)) rl.Vector2Scale(particleSpeed, float32(timeIncrement)))
} }
particleListKey.Unlock()
//fmt.Println(particleList) //fmt.Println(particleList)
particleSpeed = particleSpeed =
rl.Vector2Add( rl.Vector2Add(
particleSpeed, particleSpeed,
rl.Vector2Scale(gravity, timeIncrement)) rl.Vector2Scale(gravity, float32(timeIncrement)))
j += timeIncrement j += timeIncrement
var endTime time.Time = time.Now() var endTime time.Time = time.Now()
var elapsed time.Duration = endTime.Sub(startTime) var elapsed time.Duration = endTime.Sub(startTime)
var waitTime float64 = float64(timeIncrement) - elapsed.Seconds() var waitTime float64 = timeIncrement - elapsed.Seconds()
println(waitTime)
rl.WaitTime(waitTime) rl.WaitTime(waitTime)
println((waitTime / timeIncrement))
rl.ClearBackground(rl.RayWhite) rl.ClearBackground(rl.RayWhite)
} }
} }
@@ -61,26 +66,34 @@ func main() {
rl.EndDrawing() rl.EndDrawing()
var particleWidth float32 = 200 var particleWidth float32 = 300
var particleHeight float32 = 200 var particleHeight float32 = 200
var particleColumnCount int = 10 var particleColumnCount int = 20
var particleRowCount int = 10 var particleRowCount int = 20
var particleCount int = particleRowCount * particleColumnCount var particleCount int = particleRowCount * particleColumnCount
var particleRadius float32 = 5 var particleRadius float32 = 5
var particleColor rl.Color = rl.Black var particleColor rl.Color = rl.Black
var particleListKey sync.Mutex
//var stepSize float32 = 10 //var stepSize float32 = 10
var particleList = [MAXPOINTS]rl.Vector2{} var particleList = [MAXPOINTS]rl.Vector2{}
spawnParticlesAsGrid(particleWidth, particleHeight, particleColumnCount, particleRowCount, &particleList) spawnParticlesAsGrid(particleWidth, particleHeight, particleColumnCount, particleRowCount, &particleList)
go physics(&particleList, particleCount) go physics(&particleList, particleCount, &particleListKey)
for !rl.WindowShouldClose() { for !rl.WindowShouldClose() {
rl.ClearBackground(rl.RayWhite)
particleListKey.Lock()
rl.BeginDrawing() rl.BeginDrawing()
for i := 0; i < particleCount; i++ { for i := 0; i < particleCount; i++ {
rl.DrawCircleV(particleList[i], particleRadius, particleColor) rl.DrawCircleV(particleList[i], particleRadius, particleColor)
} }
particleListKey.Unlock()
rl.EndDrawing() rl.EndDrawing()
} }