QA@IT

Thread.start ブロック内のensure処理は必ず実行される保証はあるのでしょうか

2944 PV

Ruby1.9.3で

Thread.start do
  begin
    do_something
  ensure
    finalizing
  end
end

とやることがあるのですが、ensure内の処理はかならず実行される保証があるのでしょうか。
保証されないのだとしたらその理由は何で、どうやれば保証できるようになるでしょうか。

回答

1) シグナルを一切使わない(Ctrl-Cも押さない)
2) Thread.raise を使わない

という前提があるなら必ず実行されます。この2つがあるとダメ。なぜなら ensureに入った後、実際に終了処理が実行されるまえに例外があがってしまうとensureを抜けてしまうからです。

これはRubyの言語仕様の欠陥だと(一部で)考えられていて、コミッターの間では構文を追加する方向で議論がすすんでいます

・・・ってなにこの自作自演感。nari3あきらかに議論するときいましたよね?!

編集 履歴 (0)
  • なるほど、そういうことなんですね。ありがとうございます。 -

絶対に実行されませんね。
理由はSyntax Errorだからです。

編集 履歴 (0)
  • すみません、SyntaxErrorを直しました。 -
  • たとえば Timeout::timeout 内のensureとか気を付けないといけないですね。 -

Thread.start には関係なく、 exit! などを使えば ensure でも実行されません。

編集 履歴 (0)
  • なるほどなるほど。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。