やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

組込ライブラリ(ThreadGroup)

 スレッドグループ。一括操作できる。

成果物

情報源

ThreadGroup

スレッドグループを表すクラスです。グループに属する Thread をまとめて操作することができます。

Thread は必ずいずれかひとつのスレッドグループに属します。生成されたばかりの Thread は、生成した Thread のグループを引き継ぎます。メインスレッドはデフォルトでは ThreadGroup::Default に属します。

例: 生成したすべてのThreadが終了するのを待つ

5.times {
   Thread.new { sleep 1; puts "#{Thread.current} finished" }
}

(ThreadGroup::Default.list - [Thread.current]).each {|th| th.join}

puts "all threads finished"

対象の Thread が Thread を起こす可能性がある場合 (Thread.exclusive参照)

Thread.exclusive do
  (ThreadGroup::Default.list - [Thread.current]).each {|th| th.join}
end

ThreadGroup#freeze と ThreadGroup#enclose の違い

どちらのメソッドでも ThreadGroup#add によるスレッドの追加ができなくなる点は同じですが、 Thread.new に関して違いがあります。現在のスレッドが属する ThreadGroup が freeze されている場合、Thread.new{ ... } はエラーになります。ThreadGroup が enclose されているだけでは、 Thread.new{ ... } はエラーになりません。生成されたスレッドは従来通り 親スレッドの ThreadGroup に属します。

 なぜThreadGroup.freezeはThreadGroupクラスのメソッドなのにThreadクラスのメソッドnewでエラー発生するようにできてしまうの? そもそもそれらをエラー発生するようにする必要性もよくわからない。なんかマズイことあるの?

メンバ抜粋

特異メソッド

new

インスタンスメソッド

add enclose enclosed? list

定数

Default

new

thread_group = ThreadGroup.new
thread_group.add Thread.new { sleep 0.1; Thread.new { sleep 1 }; sleep 1 }
thread_group.add Thread.new { sleep 2 }
sleep 0.5
thread_group.list # => [#<Thread:0x007fc6f1842d70 sleep>, #<Thread:0x007fc6f1842c80 sleep>, #<Thread:0x007fc6f080dba8 sleep>]

所感

 addlistしかないのかよ。deleteもなければstartstopもない。ただ入れ物に追加するだけの存在。配列じゃダメだったの?

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux