ref: 1753ea7ecead5f56f50b13dfc85118f9a0d54f56
dir: /lib/thread/smoketest.myr/
use std use sys use thread var val : uint64 = 0 var done : uint32 = 0 var mtx : thread.mutex const Nherd = 20 const main = { atomictest() mtxtest() } const atomictest = { done = 0 val = 0 mkherd(Nherd, atomicincvar) while thread.xget(&done) != Nherd /* nothing */ ;; std.assert(val == 20_000_000, "atomics are broken\n") } const atomicincvar = { var i for i = 0; i < 1_000_000; i++ thread.xadd(&val, 1) ;; std.write(1, "done\n") thread.xadd(&done, 1) } const mtxincvar = { var i for i = 0; i < 100_000; i++ thread.mtxlock(&mtx) val++ thread.mtxunlock(&mtx) ;; std.write(1, "done\n") thread.xadd(&done, 1) } const mtxtest = { done = 0 val = 0 mtx = thread.mkmtx() mkherd(Nherd, mtxincvar) while thread.xget(&done) != Nherd /* nothing */ ;; if val != 100_000 * 20 std.fatal("mutexes are broken, got {}\n", val) ;; } const mkherd = {n, fn for var i = 0; i < n; i++ std.try(thread.spawn(fn)) ;; }