System() and `` problem in Multithreading

Hi:

I want to execute external routines in my ruby program in a
multithreading way and capture the error information occured in external
routines into a log file. But when i executed external routines in this
way:
error_msg = /...execute cmd.../
All threads in my program didn’t seem to run in synchronous way, when i
used /system("//…execute cmd…//"),/ all threads did run
synchronously but i can’t get the error information except using this
method: /system("//…execute cmd…//* > log_file") */and then get
the information from the log_file.

i made a curt routines to recur this problem:


test.rb:

threads = []
5.times do |num|
threads << Thread.new do
system(“ruby a.rb thread#{num+1}”)
#ruby a.rb thread#{num+1}
system(“ruby b.rb thread#{num+1}”)
#ruby b.rb thread#{num+1}
system(“ruby c.rb thread#{num+1}”)
#ruby c.rb thread#{num+1}
system(“ruby d.rb thread#{num+1}”)
#ruby d.rb thread#{num+1}
end
sleep(1)
end
threads.each {|t| t.join}


a.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise “#{time_now} AAAAA Exception #{ARGV}”



b.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise “#{time_now} BBBBB Exception #{ARGV}”



c.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise “#{time_now} CCCCC Exception #{ARGV}”



d.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise “#{time_now} DDDDD Exception #{ARGV}”


when use */system /*the output as follow:

D:\Mywork\Ruby\project>ruby test.rb
a.rb:3: 00:12:58 AAAAA Exception thread1 (RuntimeError)
a.rb:3: 00:12:59 AAAAA Exception thread2 (RuntimeError)
a.rb:3: 00:13:00 AAAAA Exception thread3 (RuntimeError)
a.rb:3: 00:13:01 AAAAA Exception thread4 (RuntimeError)
a.rb:3: 00:13:02 AAAAA Exception thread5 (RuntimeError)
b.rb:3: 00:13:03 BBBBB Exception thread1 (RuntimeError)
b.rb:3: 00:13:04 BBBBB Exception thread2 (RuntimeError)
b.rb:3: 00:13:05 BBBBB Exception thread3 (RuntimeError)
b.rb:3: 00:13:06 BBBBB Exception thread4 (RuntimeError)
b.rb:3: 00:13:07 BBBBB Exception thread5 (RuntimeError)
c.rb:3: 00:13:08 CCCCC Exception thread1 (RuntimeError)
c.rb:3: 00:13:09 CCCCC Exception thread2 (RuntimeError)
c.rb:3: 00:13:10 CCCCC Exception thread3 (RuntimeError)
c.rb:3: 00:13:11 CCCCC Exception thread4 (RuntimeError)
c.rb:3: 00:13:12 CCCCC Exception thread5 (RuntimeError)
d.rb:3: 00:13:13 DDDDD Exception thread1 (RuntimeError)
d.rb:3: 00:13:14 DDDDD Exception thread2 (RuntimeError)
d.rb:3: 00:13:15 DDDDD Exception thread3 (RuntimeError)
d.rb:3: 00:13:16 DDDDD Exception thread4 (RuntimeError)
d.rb:3: 00:13:18 DDDDD Exception thread5 (RuntimeError)

but when use */cmd /*the output as follow:

D:\Mywork\Ruby\project>ruby test.rb
a.rb:3: 00:16:17 AAAAA Exception thread1 (RuntimeError)
a.rb:3: 00:16:22 AAAAA Exception thread2 (RuntimeError)
b.rb:3: 00:16:22 BBBBB Exception thread1 (RuntimeError)
b.rb:3: 00:16:28 BBBBB Exception thread2 (RuntimeError)
a.rb:3: 00:16:28 AAAAA Exception thread3 (RuntimeError)
c.rb:3: 00:16:28 CCCCC Exception thread1 (RuntimeError)
b.rb:3: 00:16:33 BBBBB Exception thread3 (RuntimeError)
d.rb:3: 00:16:33 DDDDD Exception thread1 (RuntimeError)
c.rb:3: 00:16:33 CCCCC Exception thread2 (RuntimeError)
a.rb:3: 00:16:33 AAAAA Exception thread4 (RuntimeError)
c.rb:3: 00:16:38 CCCCC Exception thread3 (RuntimeError)
d.rb:3: 00:16:38 DDDDD Exception thread2 (RuntimeError)
b.rb:3: 00:16:38 BBBBB Exception thread4 (RuntimeError)
d.rb:3: 00:16:44 DDDDD Exception thread3 (RuntimeError)
a.rb:3: 00:16:44 AAAAA Exception thread5 (RuntimeError)
c.rb:3: 00:16:44 CCCCC Exception thread4 (RuntimeError)
b.rb:3: 00:16:49 BBBBB Exception thread5 (RuntimeError)
d.rb:3: 00:16:49 DDDDD Exception thread4 (RuntimeError)
c.rb:3: 00:16:54 CCCCC Exception thread5 (RuntimeError)
d.rb:3: 00:16:59 DDDDD Exception thread5 (RuntimeError)

The expected output is the first one(use /system/), but i don’t know
why the output is different between the two ways. Could you someone can
tell me why? :slight_smile:
Thank you very much!

regards

On Jun 5, 2008, at 10:23 AM, Lee Youser wrote:

The expected output is the first one(use /system/), but i don’t know
why the output is different between the two ways. Could you someone
can
tell me why? :slight_smile:
Thank you very much!

the order threads run is always undefined unless you coordinate
them. it’s just luck they are run in order for you - make your system
very busy and you will see this.

regards.

a @ http://codeforpeople.com/

On Jun 5, 2:19 pm, “ara.t.howard” [email protected] wrote:

very busy and you will see this.

regards.

a @http://codeforpeople.com/

we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama

As our Opearting Systems professor drove this into our brains daily,
so shall I repeat it here: You can make no assumptions about the
relative rate of concurrent processes.