I'm hoping someone can shed light on why this program occasionally fails to 
terminate. I compiled it with Nim 0.18.0 on Linux x64, GCC 5.4.0.

During most executions, the worker threads receive their terminal message, and 
exit. But sometimes they don't get the message, so they are stuck in recv() 
indefinitely. What conditions could cause a message sent from the main thread 
to not be received by a worker?
    
    
    # nim c --threads:on test.nim && while true; do ./test; done
    
    import strformat
    
    type
      InMsg = object
        payload: int
      
      InChan = Channel[InMsg]
      
      WorkerArg = object
        id: int
        chanp: ptr InChan
      
      Worker = Thread[WorkerArg]
    
    proc worker(arg: WorkerArg) {.thread.} =
      var chan = arg.chanp[]
      while true:
        var msg : InMsg = recv(chan)
        if msg.payload == 0:        # the kill signal
            break
      echo fmt"{arg.id}: worker done."
    
    proc main() =
      const N = 5
      var
        chans: array[1..N, InChan]
        workers : array[1..N, Worker]
        msg: InMsg
      for i in 1..N:
        chans[i].open
        let
          arg = WorkerArg(id:i, chanp:addr chans[i])
        createThread(workers[i], worker, arg)
        msg.payload = 0             # send the kill signal
        send(chans[i], msg)
      joinThreads(workers)
      echo "program complete."
    
    if isMainModule:
      main()
    

Reply via email to