Threads After Fork

Am I understanding this example right:

#!/usr/bin/env ruby -wKU

printer = Thread.new do
   10.times do
     sleep 1
     puts "Thread running in #{Process.pid}..."
   end
end

fork do
   p [Process.pid, printer.status]
   printer.join
end

p [Process.pid, printer.status]
printer.join
# >> [457, "sleep"]
# >> [458, false]
# >> Thread running in 457...

__END__

Are all other threads stopped as part of a process fork?

James Edward Gray II

From the fork documentation ....

"The thread calling fork is the only thread in the created child process. fork doesn’t copy other threads."

And I modified your script slightly so things are a little more clear ...

#!/usr/bin/env ruby -wKU

p "parent: #{Process.pid}"

printer = Thread.new do
   10.times do
     sleep 1
     puts "Thread running in #{Process.pid}..."
   end
end

fork do
   p "child: #{Process.pid}"
   p [Process.pid, printer.status]
   printer.join
end

p [Process.pid, printer.status]
printer.join

# >> "parent: 9409"
# >> [9409, "sleep"]
# >> "child: 9410"
# >> [9410, false]
# >> Thread running in 9409...

So when the child is forked, only the parent thread is copied over and the "printer" thread has been killed in the child. Hence, you get the "false" response for the status. And I'll stop being pedantic now :wink:

Blessings,
TwP

···

On Jan 20, 2009, at 8:55 AM, James Gray wrote:

Am I understanding this example right:

#!/usr/bin/env ruby -wKU

printer = Thread.new do
10.times do
   sleep 1
   puts "Thread running in #{Process.pid}..."
end
end

fork do
p [Process.pid, printer.status]
printer.join
end

p [Process.pid, printer.status]
printer.join
# >> [457, "sleep"]
# >> [458, false]
# >> Thread running in 457...

__END__

Are all other threads stopped as part of a process fork?

Man, I swear I've read that documentation 400 times now and just keep missing that. Thanks for the reading lesson Tim!

James Edward Gray II

···

On Jan 20, 2009, at 1:42 PM, Tim Pease wrote:

On Jan 20, 2009, at 8:55 AM, James Gray wrote:

Am I understanding this example right:

#!/usr/bin/env ruby -wKU

printer = Thread.new do
10.times do
  sleep 1
  puts "Thread running in #{Process.pid}..."
end

fork do
p [Process.pid, printer.status]
printer.join
end

p [Process.pid, printer.status]
printer.join
# >> [457, "sleep"]
# >> [458, false]
# >> Thread running in 457...

__END__

Are all other threads stopped as part of a process fork?

From the fork documentation ....

"The thread calling fork is the only thread in the created child process. fork doesn’t copy other threads."

Hi,

printer = Thread.new do
  10.times do
    sleep 1
    puts "Thread running in #{Process.pid}..."
  end
end

fork do
  p [Process.pid, printer.status]
  printer.join
end

Are all other threads stopped as part of a process fork?

fork doesn’t copy other threads.

Man, I swear I've read that documentation 400 times now and just keep
missing that.

A soothing fact that even the well-experienced Ruby programmer
sometimes detects new aspects.

I think the amazing strike is that the variable containing the
Thread instance still exists whilst the Thread will surely be
dead. Joining a dead thread does just nothing. I reduced it to
these two lines:

  t = Thread.new do sleep 100 end
  fork do puts t.inspect end

Output:

  #<Thread:0x28456bcc dead>

Bertram

···

Am Mittwoch, 21. Jan 2009, 04:48:14 +0900 schrieb James Gray:

On Jan 20, 2009, at 1:42 PM, Tim Pease wrote:

On Jan 20, 2009, at 8:55 AM, James Gray wrote:

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de