Your original example works if you also make `uninitialized` global because if
you don't, it will create a new var for every call to `lockBlock`. For example:
# ty.nim
import locks
template lockBlock*(code: untyped): untyped =
var lock {.global.}: Lock # declare to globals
var uninitialized {.global.} = true
# template local variable for one time initialization
if uninitialized:
uninitialized = false
initLock(lock)
# copy withLock implementation
block:
acquire(lock)
defer:
release(lock)
{.locks: [lock].}:
code
Run
# tx.nim
import ty, threadpool
var val = 0
proc run() =
lockBlock:
var n = val
for i in ..10000:
n += 1 - 2*(i mod 2) # what is doing here does not mater
val = n
for i in 1..8: spawn run()
sync()
echo val # correct output should be 8
Run