proc main() =
      var threads: array[0..4, Thread[tuple[a, b: int]]]
      var res: Atomic[int]
      
      proc worker(interval: tuple[a, b: int]) {.gcsafe, nimcall, thread.} =
        # loop over interval and compute some value
        res += value
      
      for i in 0..high(threads):
        let first = ... # computing first and last index of a chunk of data
        let last = ...
        createThread(threads[i], worker, (first, last))
      joinThreads(threads)
    
    Run

nim compiler output: Error: illegal capture 'res' because 'worker' has the 
calling convention: <nimcall>

If I omit nimcall, the signature of the worker proc does not match the expected 
2nd argument of createThread(). I do understand why these errors make sense in 
general, but in this specific case it should be fine to capture res, since it's 
of type Atomic, shouldn't it?

Is there anything I can do to convince the compiler to compile the code?

I know there are other ways to achieve what I want, but I'm currently only 
interested in this specific case.

Reply via email to