組み込みクラス
Thread
library _builtin
添付ライブラリ
- マルチスレッド・同期
- thread Mutex, Queue などのスレッド関連ユーティリティ
- timeout タイムアウトを行うメソッド timeout
- monitor モニタライブラリ (並行処理プリミティブ)
- mutex_m Mutexのモジュール版
- sync Mix-inにより再入可能なreader/writerロック機能を提供するライブラリ
- thwait thread synchronization class
スレッドの動作について。rubyソースコード解説より
- 第19章 スレッド
- いつ
- どのスレッドに
- どうやって
- コンテキストを切り替えるか
- いつ:トリガー
- I/O待ち
- 別スレッド待ち
- 時間待ち
- 時間切れによる切り替え
- どのスレッドに:スケジューリング
- rb_thread_schedule()
- select
- selectの準備
- selectを呼ぶ
- タイムアウト/正常終了
- 次のスレッドを決定
- スレッドを切り替える
- どうやって:コンテキストスイッチ
- rb_thread_save_context()
プリエンプティブ・ノンプリエンプティブ
実際の例。
socket ライブラリを使った場合、 Socket.gethostbyaddr か Socket.getaddrinfo を使って逆引きを行います。これらは同名の C の関数を内部的に呼びます。逆引きには数秒間かかることがありますが、Ruby のスレッドはユーザレベルスレッドであるため、C の関数を呼んでいる間は他のスレッドはまったく動きません。このため、マルチスレッドで並列に逆引きしようとしても実際には逐次的に行われてしまいます。一方、 resolv ライブラリでは gethostbyaddr などに相当する部分が Ruby で書かれているため、Cの関数呼び出しで長時間ブロックされることなしに、並列に逆引きを行えます。