Posted to tcl by mjanssen at Sat Apr 22 20:11:04 GMT 2017view pretty

    puts "[thread::id] All workers done, exiting"
    set ::workers_done 1
  }
}

proc start_worker {main} {
  set id [thread::create {
    proc start tid {
      while 1 {
        puts "[thread::id]: Asking for work"
        set work [thread::send $tid getwork]
        if {$work ne {}} {
          puts "[thread::id]: Doing work $work"
          after 1000
        } else {
          puts "[thread::id]: No more work"
          thread::send $tid [list remove_worker [thread::id]]
          thread::exit
        }		
      }
    }
    vwait forever
  }]
  thread::send -async $id [list start $main]
  lappend ::workers $id
}
# start 2 workers
time [list start_worker [thread::id]] 2

vwait workers_done