I wanted to add more examples to <https://nim-lang.org/docs/typedthreads.html> 
as I feel that some modules lack documentation.

I wrote a small program to show how to share memory between threads in Nim:
    
    
    import locks
    
    type Example = ref object
        s: string
        c: int
        lock: Lock
    
    proc newExample(): Example =
        new(result, proc(eo: Example) =
            deinitLock(eo.lock)
        )
        initLock(result.lock)
    
    proc threadFunc(obj: Example) {.thread.} =
        withLock obj.lock:
            obj.s.add($obj.c)
            inc obj.c
    
    proc threadHandler() =
        var thr: array[0..4, Thread[Example]]
        var myObj = newExample()
        
        for i in 0..high(thr):
            createThread(thr[i], threadFunc, myObj)
        joinThreads(thr)
        echo myObj[]
    
    echo "Work"
    threadHandler()
    echo "Done."
    
    
    Run

The issue is that this program crashes, but only on windows, and only about 10% 
of the time. I suspect this is a race condition, but I cannot find it. I have 
no stack trace from the crash, so I cannot easily understand what is going on. 
The crash occurs as often on `-d:debug`, `-d:release` and `-d:danger`. I'm 
using Nim 2.0.2 (so with ORC)

Apart from the crash, I'm getting a warning that `Warning: A custom '=destroy' 
hook which takes a 'var T' parameter is deprecated`. This is because the 
destructor of my Example object needs to deinitLock the lock, so I need a `var 
Example` to do so. Is there a way to get around this warning ?

Reply via email to