Posted to tcl by mjanssen at Sat Apr 22 20:00:43 GMT 2017view pretty

package require Thread

set allwork {1 2 3 4 5 6 7}

proc getwork {} {
  puts "[thread::id] distributing work" 
  puts $::allwork
  set ::allwork [lassign $::allwork work]
  return $work
}

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::exit
        }		
      }
    }
    vwait forever
  }]
  thread::send -async $id [list start $main]
}
# start 2 workers
time [list start_worker [thread::id]] 2

vwait forever