From: Yoshiki Wada <wada / wombat.or.jp>
> スレッドをループの中に入れて、こんな風に使っています。
> 
>   for i in 1 .. 10
>     ...
>     Thread.start do
>       th_i = i	# (A) スレッドローカルな変数にコピー
>       ...
>     end
>     ...
>   end
> 
> (A)の部分のth_iには、そのスレッドが始まった時の
> iの値を代入したいのですが、タイミングによっては
> forループが先に進んでしまったりしないでしょうか。
> 
> 正しい書き方があれば教えてください。

(A) の直前に「sleep 10」とか入れると大抵駄目ですよね。
私もそのことで悩んだことがあって、最初は以下の様にしていました。

  def hoge(th_i)
    Thread.start do
      ...
    end
  end

  for i in 1 .. 10
    ...
    hoge(i)
    ...
  end

ただ、これだと面倒かつ読みにくいので、今は以下の様に
することにしています。

  # Thread に引数を渡せないのは辛いから、
  # 引数の渡せる start を自前で作る。
  class Thread
    def Thread::start_with_args(*args, &block)
      return Thread.start {
	block.call(*args)
      }
    end
  end

  for i in 1 .. 10
    ...
    Thread.start_with_args(i) {|th_i|
      ...
    end
    ...
  end

---------------------------------------------------
 九州大学大学院システム情報科学研究科 情報工学専攻
 栗栖 直士 <kurisu / swlab.csce.kyushu-u.ac.jp>
---------------------------------------------------