Thank you!

Is true if instead of passing integers I pass ref objects? This appears to work:
    
    
    # Producer consumer with regular nim threads:
    import locks, os
    
    var
      qLock: Lock
      consumers: array[0 .. 9, Thread[void]]
    
    type RefObject = ref object
      name: string
      next: RefObject
    
    var q: seq[RefObject]
    
    initLock(qLock)
    
    for i in 0 ..< 20:
      echo "produce: ", i
      q.add(RefObject(name: "name" & $i))
    
    proc consumer() {.thread.} =
      while true:
        acquire(qLock)
        var refObject: RefObject
        {.gcsafe.}:
          if q.len == 0:
            echo "exit"
            release(qLock)
            return
          refObject = q.pop()
        release(qLock)
        
        refObject.next = RefObject()
        sleep(100) # do some work every second
        echo "consume: ", refObject.name
    
    for i in 0 ..< 10:
      createThread(consumers[i], consumer)
    
    joinThreads(consumers)
    
    
    Run

Reply via email to