Files

60 lines
977 B
V

module main
import x.atomics
struct SpinLock {
mut:
state u32 // 0 = unlocked, 1 = locked
}
fn acquire(mut spinlock SpinLock) {
for !atomics.cas_u32(&spinlock.state, 0, 1) {
// Busy-wait
}
}
fn release(mut spinlock SpinLock) {
atomics.store_u32(&spinlock.state, 0)
}
struct SharedData {
mut:
spinlock SpinLock
value int
}
fn worker(mut data SharedData, iterations int) {
for _ in 0 .. iterations {
acquire(mut data.spinlock)
data.value++
release(mut data.spinlock)
}
}
fn main() {
mut data := &SharedData{}
num_threads := 4
iterations_per_thread := 10000
mut threads := []thread{}
for _ in 0 .. num_threads {
threads << spawn worker(mut data, iterations_per_thread)
}
threads.wait()
expected := num_threads * iterations_per_thread
actual := data.value
println('Expected: ${expected}')
println('Actual: ${actual}')
if actual == expected {
println('Spinlock works correctly')
} else {
println('Race condition detected')
}
}