60 lines
977 B
V
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')
|
|
}
|
|
}
|