[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Threads After Fork

James Gray

1/20/2009 3:56:00 PM

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


3 Answers

Tim Pease

1/20/2009 7:42:00 PM

0

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

> 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=

James Gray

1/20/2009 7:48:00 PM

0

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 =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=

Bertram Scharpf

1/21/2009 11:42:00 AM

0

Hi,

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:
>>
>>> 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-...