K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_12(Tue)

サンタクロース巡回問題かと思ったら違った。ので、解いてみようと思う。

wait_tonakais = []
wait_kobitos = []
$players = []

def next_fiber
  $players << (f = $players.shift)
  f.yield
end

9.times{
  $players << Fiber.new{
    next_fiber while rand(5) % 2 == 0
    wait_tonakais << Fiber.current
    puts "Tonakai (#{wait_tonakais.size}) reached."
    (wait_tonakais = []; puts "9 Tonakais are reached.") if wait_tonakais.size == 9
    next_fiber while wait_tonakais.include? Fiber.current
    redo
  }
}

3.times{
  $players << Fiber.new{
    next_fiber while rand(5) % 2 == 0
    wait_kobitos << Fiber.current
    puts "Kobito (#{wait_kobitos.size}) reached."
    (wait_kobitos = []; puts "3 Kobitos are reached.") if wait_kobitos.size == 3
    next_fiber while wait_kobitos.include? Fiber.current
    redo
  }
}

next_fiber

32行。

やはり、Fiber local ではなく Thread local な何かは要るなぁ。rare case な気はするので、API を追加するべきかどうかは難しい。


JRuby を使ってみた。

str = ''
max = 1000
(1..4).map{|e|
  Thread.new(e){|ti|
    max.times{
      str << ti.to_s
    }
  }
}.each{|t| t.join}
p str

結果:

c:\ko1\src\rb>c:\app\Java\jruby-1.0\bin\jruby t.rb
System.java:-2:in `java.lang.System.arraycopy': java.lang.ArrayIndexOutOfBoundsException: null (NativeException)
        from ByteList.java:497:in `org.jruby.util.ByteList.grow'
        from ByteList.java:197:in `org.jruby.util.ByteList.append'
        from ByteList.java:189:in `org.jruby.util.ByteList.append'
        from RubyString.java:714:in `org.jruby.RubyString.cat'
        from RubyString.java:1125:in `org.jruby.RubyString.append'
        from RubyString.java:1136:in `org.jruby.RubyString.concat'
        from RubyString.java:243:in `org.jruby.RubyString.callMethod'
        from RubyObject.java:488:in `org.jruby.RubyObject.compilerCallMethodWithIndex'
         ... 18 levels...
        from RubyNativeThread.java:73:in `org.jruby.internal.runtime.RubyNativeT
hread.run'
        from :-1
        from :-1:in `initialize'
Complete Java stackTrace
java.lang.ArrayIndexOutOfBoundsException
        at java.lang.System.arraycopy(Native Method)
        at org.jruby.util.ByteList.grow(ByteList.java:497)
        at org.jruby.util.ByteList.append(ByteList.java:197)
        at org.jruby.util.ByteList.append(ByteList.java:189)
        at org.jruby.RubyString.cat(RubyString.java:714)
        at org.jruby.RubyString.append(RubyString.java:1125)
        at org.jruby.RubyString.concat(RubyString.java:1136)
        at org.jruby.RubyString.callMethod(RubyString.java:243)
        at org.jruby.RubyObject.compilerCallMethodWithIndex(RubyObject.java:488)

        at org.jruby.javasupport.util.CompilerHelpers.doInvokeDynamicIndexed(Com
pilerHelpers.java:134)
        at EVAL14620722.closure2(EVAL14620722:8)
        at EVAL14620722Blockclosure2xx1.call(Unknown Source)
        at org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:87)
        at org.jruby.runtime.Block.yield(Block.java:186)
        at org.jruby.RubyInteger.times(RubyInteger.java:166)
        at org.jruby.RubyIntegerInvokertimes0.call(Unknown Source)
        at org.jruby.runtime.callback.InvocationCallback.execute(InvocationCallb
ack.java:49)
        at org.jruby.internal.runtime.methods.FullFunctionCallbackMethod.interna
lCall(FullFunctionCallbackMethod.java:78)
        at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.j
ava:79)
        at org.jruby.RubyObject.compilerCallMethod(RubyObject.java:509)
        at org.jruby.javasupport.util.CompilerHelpers.doInvokeDynamic(CompilerHe
lpers.java:124)
        at EVAL14620722.closure1(EVAL14620722:7)
        at EVAL14620722Blockclosure1xx1.call(Unknown Source)
        at org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:87)
        at org.jruby.runtime.CompiledBlock.call(CompiledBlock.java:69)
        at org.jruby.RubyProc.call(RubyProc.java:173)
        at org.jruby.RubyProc.call(RubyProc.java:148)
        at org.jruby.internal.runtime.RubyNativeThread.run(RubyNativeThread.java:73)

誰だよ、JRuby は並列実行サポートしてるって言った奴。


とかそういう話を隣にいた charles にしてみたら、「デバッグ中」という答えが返ってきた。これが嫌だからYARVではネイティブスレッドは並列実行させないんだよ、って言ったら、「あー、CRuby は segv するから大変だよね」という。問題は同じだと思うんだがなあ。

とりあえず、JRuby で並列実行は危険。


好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $