Ruby

[Ruby]Threadについての紹介

1年くらい前にRubyの勉強のためにThreadクラスのメソッドや基礎をまとめたもの

参考
https://docs.ruby-lang.org/ja/latest/class/Thread.html
https://docs.ruby-lang.org/ja/latest/class/Thread=3a=3aMutex.html
https://docs.ruby-lang.org/ja/latest/class/Fiber.html

スレッド基礎
・スレッド
 スレッドとはメモリ空間を共有して同時に実行される制御の流れのこと。 
 
・スレッドの変数の扱い
 同じプロセス上の他のスレッドとメモリを共有する。
 そのため他のスレッドと共有したくない値は、ブロックの仮引数として受け取る。ブロックローカル変数にすると他のスレッドと共有されなくなる。

スレッドの状態
・run :実行or実行可能状態
・sleep :停止状態
・aborting :終了処理中
・dead :終了状態

スレッドの生成

Thread#fork
スレッドの生成してブロックの評価を開始する。

Thread#join
スレッドが終了するまで待つ

Thread#value
スレッドが終了するまで待ち、戻り値を得る

スレッドの操作

Thread#wakeup
停止スレッドを実行可能状態にする

Thread#run
即座に処理をそのスレッドに切り替える

Thread#kill
生きている状態のスレッドの終了

Thread#pass
現在のスレッドから他のスレッドに実行を移す

Thread### スレッドの優先順位
優先順位の値が大きいほどスレッドの優先度が高くなる

Thread#priority
スレッドの優先度を確認する

ThreadGroup

すべてのスレッドはどこかのスレッドグループに属しており、デフォルトはThreadGroup::Defaultに属している。

ThreadGroup#group
自身の所属グループを得る

ThreadGroup#add
グループにスレッドを追加する

ThreadGroup#list
グループのスレッド一覧

Mutex

共有データを並行アクセスから保護するためにある。排他制御を行う。
Mutex#lock、Mutex#unlock、Mutex#locked?などのメソッドがある。

Mutex#try_lock
ロックをしようとしてロックが成功したらtrueを返す。失敗ならfalse。

Fiber

ノンプリエンプティブな軽量スレッドを提供する。Threadと違い処理の流れを扱うことができる。例えば、処理を途中まで実行して、その後任意のタイミングで再開させることが出来る。

Process

プロセスを管理するモジュール。デーモンプロセスを生成、操作できる。
スレッドと違いメモリを共有しない。