From: Krzysztof F. <fru...@gm...> - 2011-06-12 08:01:40
|
Hello again, I was trying to solve the problem from my previous post using mutex. But it does not seem to work. Blow is the code. Senders, one worker. package require Thread tsv::set threads worker [thread::create] tsv::set threads sender1 [thread::create] tsv::set threads sender2 [thread::create] tsv::set threads sender3 [thread::create] puts "sender 1: [tsv::get threads sender1]" puts "sender 2: [tsv::get threads sender2]" puts "sender 3: [tsv::get threads sender3]" puts "worker: [tsv::get threads worker]" tsv::set db mutex [thread::mutex create] thread::send [tsv::get threads worker] { package require Expect set timeout 2 spawn picocom /home/dib/vmodem0 } thread::send -async [tsv::get threads sender1] { package require Thread for {set i 0} {$i < 3} {incr i} { set mutex [tsv::get db mutex] thread::mutex lock $mutex thread::send -async [tsv::get threads worker] { puts "Worker IN - from sender1" catch {expect { "D" {puts "[thread::id] got D"} timeout {puts "[thread::id] timedout"} } } puts "Worker OUT - from sender1" } thread::mutex unlock $mutex ::after 1110 } } thread::send -async [tsv::get threads sender2] { package require Thread for {set i 0} {$i < 3} {incr i} { set mutex [tsv::get db mutex] thread::mutex lock $mutex thread::send -async [tsv::get threads worker] { puts "Worker IN - from sender2" catch {expect { "D" {puts "[thread::id] got D"} timeout {puts "[thread::id] timedout"} } } puts "Worker OUT - from sender2" } thread::mutex unlock $mutex ::after 690 } } thread::send -async [tsv::get threads sender3] { package require Thread for {set i 0} {$i < 3} {incr i} { set mutex [tsv::get db mutex] thread::mutex lock $mutex thread::send -async [tsv::get threads worker] { puts "Worker IN - from sender3" catch {expect { "D" {puts "[thread::id] got D"} timeout {puts "[thread::id] timedout"} } } puts "Worker OUT - from sender3" } thread::mutex unlock $mutex ::after 550 } } puts "main thread done" thread::wait An the output: sender 1: tid0x7f2a8a059700 sender 2: tid0x7f2a89858700 sender 3: tid0x7f2a89057700 worker: tid0x7f2a8a85a700 spawn picocom /home/dib/vmodem0 main thread done Worker IN - from sender1 Worker IN - from sender2 Worker IN - from sender3 picocom v1.4 port is : /home/dib/vmodem0 flowcontrol : none baudrate is : 9600 parity is : none databits are : 8 escape is : C-a noinit is : no noreset is : no nolock is : no send_cmd is : ascii_xfr -s -v -l10 receive_cmd is : rz -vv Terminal ready Worker IN - from sender3 Worker IN - from sender2 Worker IN - from sender3 Worker IN - from sender1 Worker IN - from sender2 Worker IN - from sender1 tid0x7f2a8a85a700 timedout Worker OUT - from sender1 tid0x7f2a8a85a700 timedout Worker OUT - from sender2 tid0x7f2a8a85a700 timedout Worker OUT - from sender1 tid0x7f2a8a85a700 timedout Worker OUT - from sender3 tid0x7f2a8a85a700 timedout Worker OUT - from sender2 tid0x7f2a8a85a700 timedout Worker OUT - from sender3 tid0x7f2a8a85a700 timedout Worker OUT - from sender3 tid0x7f2a8a85a700 timedout Worker OUT - from sender2 tid0x7f2a8a85a700 timedout Worker OUT - from sender1 Why does a mutex let several threads in to the critical section? |