Arjen Markus (11 february 2011) I have been experimenting with the Thread package a bit (after some experiences with OpenMP, MPI and so-called coarrays). The idea is that two (or more threads share the work that is to be done, but they have to keep synchronising among themselves. (The context I am thinking of is the solution or evolution over time of partial differential equations in multiple domains, but that is a mere detail - any iterative process distributing work over several threads might do.)
Here is the code that gets sourced with each thread:
# simple_run.tcl -- # Library of procedures to be used by simple.tcl # # run -- # Script to be run by each thread # # Arguments: # type Type of computation # # Returns: # Nothing # proc run {type} { # # First wait for the other thread's ID # vwait other # # Now compute, send and wait # set time 0 while { $time < 10 } { incr time if { $type == 1 } { set value $time } else { set value [expr {2 * $time}] } ::thread::send -async $::other [list set ::other_value $value] puts "$type: sent $value" vwait other_value puts "$type -- $value -- $::other_value" } ::thread::exit }
and here is the code that starts it all:
# simple.tcl -- # Simply send data back and forth between two threads # package require Thread # Create the two threads # set id1 [::thread::create -joinable { source simple_run.tcl run 1 }] set id2 [::thread::create -joinable { source simple_run.tcl run 2 }] ::thread::send -async $id1 [list set ::other $id2] ::thread::send -async $id2 [list set ::other $id1] puts "Waiting ..." ::thread::join $id1 ::thread::join $id2