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

Reply via email to