Ruby 1.9.1, Threads and "[BUG] The handle is invalid."

Hi!

I am new to this forum so this is my first post.

I have Ruby 1.9.1 on Windows 7 and I am trying to make a program that
will do some jobs in threads.
A simplified version of what I want to do would look like this:

$threads_alowed = 700;
$threads = []

$threads_alowed.times{|thread_id|
$threads[thread_id] = {‘thread’ => Thread.new{}}
puts “thID #{thread_id} initialized”
}

def do_something(thread_id)
wait = rand(300)
print “\nThread #{thread_id} is doing something for #{wait} seconds”
sleep wait
end

while true do
$threads_alowed.times{|thread_id|
status = $threads[thread_id][‘thread’].status
if status == false or status == nil
$threads[thread_id][‘thread’] =
Thread.new(thread_id){do_something(thread_id)}
print “,”
end
}
print “.”
sleep 0.03
end

It seems to work but often I get the following error:

[BUG] The handle is invalid.

ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]

– control frame ----------

– Ruby level backtrace
information-----------------------------------------

[NOTE]
You may encounter a bug of Ruby interpreter. Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

This application has requested the Runtime to terminate it in an unusual
way.
Please contact the application’s support team for more information.

and all the script crashes.

I tried to run the same script on CentOS and it is working without
problems, but I can not stick to just one OS. I need this script to work
on every OS that Ruby runs on.

So my question is: Does anybody know how to get rid of this error on
windows or maybe any workaround and what this error mean?

On Apr 21, 2010, at 9:25 AM, John B. wrote:

information-----------------------------------------

and all the script crashes.

I tried to run the same script on CentOS and it is working without
problems, but I can not stick to just one OS. I need this script to work
on every OS that Ruby runs on.

So my question is: Does anybody know how to get rid of this error on
windows or maybe any workaround and what this error mean?

You might want to try the release from ruby-lang.org [1]. It is built
differently than the version you are running (I assume you got it from
rubyinstaller.org). The Ruby from ruby-lang is built using Microsoft’s
development tools and calls into Win32 APIs directly. The version from
rubyinstaller.org is built against MinGW which provides a POSIX
emulation layer on top of most Windows APIs. As a result, the mingw
version exercises more UNIX code paths than it does Windows code paths
in the 1.9.x source.

That said, you should still submit your code example as a bug report
against the 1.9.x codebase.

cr

[1] http://www.ruby-lang.org/en/downloads/

Chuck R. wrote:

You might want to try the release from ruby-lang.org [1]. It is built
differently than the version you are running (I assume you got it from
rubyinstaller.org).

Thanks for your reply. Going to give a try right now.

On Apr 21, 2010, at 10:36 AM, John B. wrote:

John B. wrote:

… Going to give a try right now.

Unfortunately I get the same crash with mswin32 build. :frowning:

Then it’s a genuine bug that you should report.

You might also want to give IronRuby and JRuby a try. Both run on
Windows.

cr

Chuck R. wrote:

Then it’s a genuine bug that you should report.

You might also want to give IronRuby and JRuby a try. Both run on
Windows.

cr

Already reported: http://redmine.ruby-lang.org/issues/show/3183
Thanks for your suggestions.

John B. wrote:

… Going to give a try right now.

Unfortunately I get the same crash with mswin32 build. :frowning:

Luis L. wrote:

As for the original reporter of the issue:

You’re trying to “print” to STDOUT from different threads, which will
produce a race conditions and depending other operations you’re
performing, highly likely will crash.

Add to that, you’re trying to spawn 700 threads, which spawned quickly
will generate overhead and highly likely you’re exhausting resources
in the process (since you don’t get a backtrace of your test script)

But more concrete, exhausting of resources could be associated with
available descriptors that Ruby 1.9 has been compiled for.

Actually I get the crash for both 700 threads and 10 threads. Initially
I wrote the script with 25 threads and the 700 one remained from the
last tests.
Also I tried to put delays between thread spawning but couldn’t get rid
of the crash.
And one more thing: I tried to run this script on JRuby and it works
without problems even with 700 threads and without any delays, so the
problem doesn’t seem to be in threads amount or resources exhausting.

On Apr 21, 11:39 am, Chuck R. [email protected] wrote:

[…]

So my question is: Does anybody know how to get rid of this error on
windows or maybe any workaround and what this error mean?

You might want to try the release from ruby-lang.org [1]. It is built differently than the version you are running (I assume you got it from rubyinstaller.org). The Ruby from ruby-lang is built using Microsoft’s development tools and calls into Win32 APIs directly. The version from rubyinstaller.org is built against MinGW which provides a POSIX emulation layer on top of most Windows APIs. As a result, the mingw version exercises more UNIX code paths than it does Windows code paths in the 1.9.x source.

Your statements are incorrect.

You’re confusing MinGW with cygwin.

MinGW provides minimal set of GNU tools for Windows (that is the
meaning of MinGW acronym)

It links and compiles against Win32API, there is no emulation layer of
POSIX functionality.

Please research before state that type of answers as it might confuse
and alienate users of Ruby on Windows platform.

As for the original reporter of the issue:

You’re trying to “print” to STDOUT from different threads, which will
produce a race conditions and depending other operations you’re
performing, highly likely will crash.

Add to that, you’re trying to spawn 700 threads, which spawned quickly
will generate overhead and highly likely you’re exhausting resources
in the process (since you don’t get a backtrace of your test script)

But more concrete, exhausting of resources could be associated with
available descriptors that Ruby 1.9 has been compiled for.

I could reach the the same crash with the following code:

somevar = []
700.times{|i|
somevar << Thread.new{}
puts “cycle #{i}”
}

On Apr 21, 2010, at 2:00 PM, Luis L. wrote:

You’re confusing MinGW with cygwin.

MinGW provides minimal set of GNU tools for Windows (that is the
meaning of MinGW acronym)

It links and compiles against Win32API, there is no emulation layer of
POSIX functionality.

Please research before state that type of answers as it might confuse
and alienate users of Ruby on Windows platform.

Oops, my mistake. Now I know the correct answer for next time.

cr

On Apr 21, 4:18 pm, John B. [email protected] wrote:

problem doesn’t seem to be in threads amount or resources exhausting.
Invalid handle might be associated with handles allocated by Ruby to
keep track of the native threads.

JRuby implements native threads but in a different way than Ruby 1.9

It will be worth waiting for answers from Ruby-Core regarding your bug
report for Ruby 1.9 project.

Also able to reach the crash with:

700.times{|i|
Thread.new{}
puts i
}

and even with:

700.times{
Thread.new{}
puts “.”
}

but not with:

700.times{
Thread.new{}
}

[Note: The script crashes even when 0 < i < 10]

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs