Threads After Fork

J

James Gray

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...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...

__END__

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

James Edward Gray II
 
T

Tim Pease

Am I understanding this example right:

#!/usr/bin/env ruby -wKU

printer =3D 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...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...

__END__

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

=46rom the fork documentation ....

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

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


#!/usr/bin/env ruby -wKU

p "parent: #{Process.pid}"

printer =3D 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...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...


So when the child is forked, only the parent thread is copied over and =20=

the "printer" thread has been killed in the child. Hence, you get the =20=

"false" response for the status. And I'll stop being pedantic now ;)

Blessings,
TwP=
 
J

James Gray

Am I understanding this example right:

#!/usr/bin/env ruby -wKU

printer =3D 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...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...

__END__

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

=46rom the fork documentation ....

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

Man, I swear I've read that documentation 400 times now and just keep =20=

missing that. Thanks for the reading lesson Tim!

James Edward Gray II=
 
B

Bertram Scharpf

Hi,

Am Mittwoch, 21. Jan 2009, 04:48:14 +0900 schrieb James Gray:
printer =3D 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=E2=80=99t copy other threads.

Man, I swear I've read that documentation 400 times now and just keep=20
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 =3D Thread.new do sleep 100 end
fork do puts t.inspect end

Output:

#<Thread:0x28456bcc dead>

Bertram


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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,818
Latest member
SapanaCarpetStudio

Latest Threads

Top