The Thread Library

# 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`

    valをnameに対応するスレッド固有のデー タとして格納します．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の典型的な使い方は(mを `Mutex`オブジェクトとします):

  >     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