=begin
Tanaka Akira さんは書きました:
Net::SSH の問題は手元では再現しないので、この問題の状況はよ
くわかりません。
以下で、おそらく同じと思われる現象が起きます。
手元では実行ごとに毎回発生していますが、
もしかすると何度か実行すると〜かもしれません。
th = []
2.times do
th << Thread.new do
open("/dev/zero") do |i|
loop do
r, = IO.select([i], [], [], 0)
if r
p i.read(1)
break
end
end
end
end
end
th.each {|t| t.join }¶
参考になるかどうかわかりませんがdebug printを入れてみました。
先頭が行番号です。
11249 /* Do the select if needed /
11250 fprintf(stderr,"%4d) need_select=%d\n",LINE,need_select); if (need_select) {
11251 / Convert delay to a timeval */
...
11267 n = select(max+1, &readfds, &writefds, &exceptfds, delay_ptr);
11268 fprintf(stderr,"%4d) n=%d\n",LINE,n); if (n < 0) {
11269 int e = errno;
...
11361 th_found = th;
11362 fprintf(stderr,"%4d) th_found=%d\n",LINE,th); found = 1;
11363 break;
...
11369 th_found = th;
11370 fprintf(stderr,"%4d) th_found=%d\n",LINE,th); found = 1;
11371 break;
...
11386 }
11387 fprintf(stderr,"%4d) th=%d th_found=%d\n",LINE,th,th_found); if ((th->status == THREAD_RUNNABLE || th == th_found) && th->stk_ptr) {
11388 if (!next || next->priority < th->priority) {
11389 fprintf(stderr,"%4d) next=th\n",LINE); next = th;
11390 }
実行結果はこんな感じになります。
(使用したのはruby 1.8.8dev (2009-08-06 revision 24416) [i686-linux]です)
- need_select=1
- n=1
- th_found=142481000
- th=142326496 th_found=142481000
- next=th
- th=142481000 th_found=142481000
- need_select=1
- n=1
- th_found=142490464
- th=142481000 th_found=142490464
- next=th
- th=142326496 th_found=142490464
- th=142490464 th_found=142490464
- need_select=1
- n=1
- th_found=142481000
- th=142326496 th_found=142481000
- next=th
- th=142490464 th_found=142481000
- th=142481000 th_found=142481000
...
1.8.7-p35でも現象が発生します。1.8.7-p{72,134}と1.9.0-p0ではすぐに終了します。¶
やまだ
=end