[ruby-list:2910] thread and fork

From: jkuro@... (Jun Kuroda)
Date: 1997-05-07 08:24:03 UTC
List: ruby-list #2910
黒田です。

ruby - version 1.0-970425 (i686-linux) 上で添付するプログラ
ムの実行結果が以下のようになります。
 thread の時 l.24 の sleep で眠ったままになってます。

- l.62 TRUE --
thread
run f
run t
run f
run t
run f
run t
run f
run t
run f
run t
timeout (thread)
end
run f
run f
run f
run f
run f
run f
end 
- --

- l.62 FALSE --
fork
run f
run t
run f
run t
run f
run t
run f
run t
run f
run t
time out (fork)
timeout (thread)
end
end
- --

- --
class TimeOut < Exception
end

def timeout_thread(sec)
  begin
    x = Thread.current
    y = Thread.start {
      sleep sec
      x.raise TimeOut, "timeout (thread)" if x.alive?
    }
    begin
      yield
    rescue TimeOut
      print $!, "\nend\n"
    end
  ensure
    Thread.kill y if y && y.alive?
  end
end

def timeout_fork(sec)
  pid = fork
  if (pid == nil)
    sleep sec
    print "time out (fork)\n"
    exit
  else
    for i in 0..10
      begin
	break if (Process.waitpid(pid, Process::WNOHANG) != 0)
      rescue
	break
      end
      print "run f\n"
      ret = i
      sleep 1
    end
    begin
      Process.kill(9,pid)
    rescue
    end
    print "end\n"
  end
  ret
end

def main_f
  ret = timeout_fork(5)
#  print ret, "\n" if ret
end

def main_t
  ret = timeout_thread(5){
    for i in 0..10
      print "run t\n"
      sleep 1
    end
  }
#  print ret, "\n" if ret
end

if TRUE #FALSE
  print "thread\n"
  f = Thread.new{
    main_f
  }
  t = Thread.new{
    main_t
  }
  while f.alive?||t.alive?
  end
else
  print "fork\n"
  if fork != nil
    main_f
  else
    main_t
  end
end
- --
- --
黒田  淳 (くろだ じゅん)

In This Thread

Prev Next