Threadライブラリ

ThreadライブラリによってRubyによる並行プログラミングが可能に なります.スレッドはメモリ空間を共有して同時に実行される制御の 流れです.Rubyインタプリタは時分割でスレッドを実行しますので, スレッドを使うことで実行速度が速くなることはありません.

プログラムの開始と同時に生成されるスレッドをmain threadと呼び ます.なんらかの理由でmain threadが終了する時には,他の全て のスレッドもプログラム全体も終了します.ユーザからの割込みによっ て発生した例外はmain threadに送られます.

Threadライブラリはコンパイル時の設定で外すことの できるオプションです.インタプリタによってはスレッドの使えない 場合があります.


Thread

Threadはユーザレベルでのスレッドを表現するクラス です.

スレッドの起動時に指定したブロックの実行が終了するとスレッド の実行も終了します.ブロックの終了は正常な終了も例外などによ る異常終了も含みます.

スーパークラス:

Object

クラスメソッド:

abort_on_exception

いずれかのスレッドが例外によって終了した時に,インタプリタ全 体を中断させるかどうかのフラグの値を返します.

abort_on_exception=(yes_no)

いずれかのスレッドが例外によって終了した時に,インタプリタ全 体を中断させるかどうかのフラグを設定します.通常あるスレッドで起こった例外は, Thread#joinなどで検出されない限り そのスレッドだけをなにも警告を出さずに終了さます.

current

現在実行中のスレッドを返します.

exit

カレントスレッドの実行を終了します.

join thread

threadで指定したスレッドの実行が終了するまで,カ レントスレッドを中断します.

kill thread

指定したスレッドの実行を終了させます.

new {...}
start {...}
fork {...}

スレッドを生成して,ブロックの評価を開始します.生成されたス レッドを返します.

pass

他のスレッドに実行権を譲ります.

stop

他のスレッドからrunメソッドで再起動されるまで, カレントスレッドの実行を停止します.

メソッド:

self[name]

nameに対応したスレッドに固有のデータを取り出しま す.nameは文字列かシンボルで指定します.

self[name]=val

valnameに対応するスレッド固有のデー タとして格納します.nameは文字列かシンボルで指定 します.

abort_on_exception

そのスレッドが例外によって終了した時に,インタプリタ全 体を中断するかどうかのフラグの値を返します.

abort_on_exception=(yes_no)

そのスレッドが例外によって終了した時に,インタプリタ全 体を中断させるかどうかのフラグを設定します.

alive?
status

スレッドが「生きている」時,真を返します.正常終了した時にはfalse, 例外終了した時にはnilを返します.

exit

スレッドの実行を終了させます.

join

スレッドの実行が終了するまで,カレントスレッドを中断します.

raise([error_type,][message][,traceback])

そのスレッドで強制的に例外を発生させます.

run

スレッドの実行を再開させます.スレッドが停止していなかった場 合にはなにもしません.

stop?

スレッドが停止している時,真を返します.

value

スレッドが停止するまで待ち,ブロックが返した値を返します.ス レッド実行中に例外が発生した場合には,その例外を再発生させま す.

wakeup

停止中のスレッドが再起動できるようにします.

Mutex

Mutex(相互排他ロック)は共有データを並行アクセスから保護する ためにあります.Mutexの典型的な使い方は(mMutexオブジェクトとします):

begin
  m.lock
  # mによって保護されたクリティカルセクション
ensure
  m.unlock
end
または,より簡単に
m.synchronize {
  # mによって保護されたクリティカルセクション
}

スーパークラス:

Object

クラスメソッド:

new

新しいmutexを生成します.

メソッド:

lock

mutexオブジェクトをロックします.一度に一つのス レッドだけがmutexをロックできます.既にロックされているmutex に対してロックを行おうとしたスレッドはmutexのロックが開放さ れるまで,実行が停止されます.

locked?

mutexがロックされている時,真を返します.

synchronize

mutexをロックし,ブロックを実行します.実行後に必ずmutexのロッ クを開放します.

try_lock

mutexをロックしようとして,ロックが成功した場合,真を返しま す.ロックできなかった場合にはブロックせず偽を返します.

unlock

mutexのロックを開放します.mutexのロック待ちになっていたスレッ ドの実行は再開されます.

Queue

Queueはスレッド間のFIFO(first in first out)の通信路です.ス レッドが空のqueueを読み出そうとすると停止します.queueになんら かの情報が書き込まれると実行は再開されます.

スーパークラス:

Object

クラスメソッド:

new

新しいqueueオブジェクトを生成します.

メソッド:

empty?

queueが空の時,真を返します.

length

queueの長さを返します.

pop [non_block]

queueからひとつ値を取り出します.queueが空の時,呼出元のスレッ ドは停止します.省略可能な引数non_blockがnilでな い時,popはqueueが空の時に例外を発生します.

push value

queueの値を追加します.待っているスレッドがいれば実行を再開 させます.


- - 目次

matz@netlab.co.jp