プログラミングに役立つ情報をメモしています
Ruby プログラミング

Ruby入門 PART10 (Thread,Mutex,Queue) (全11回)

パーフェクトRubyを読んで、重要なポイント等をメモしていきます.

Thread

Ruby1.9以降はネイティブスレッドを使用して実装されている

ネイティブスレッド生成はシステムコールを使用するため比較的低速らしい

そのためスレッドは最初に作ってプールしておくことが望ましい

CRubyではGiant VM Lock(GVL)を使用して同時に実行されるスレッドを1つに制限している。既存の拡張ライブラリと標準ライブラリ(String,Arrayすら)がスレッドセーフに作られていないため。そのためCPUがマルチコアだろうとシングルコアだろうとパフォーマンスは変わらない。

ただし、IOでブロックが発生するシステムコールが呼ばれる場合にはGVLが解放され、複数のスレッドが同時に実行されるので高速化が見込める。

Mutex

以下WikiPediaより引用

・ミューテックス (Mutual Exclusion) とは、クリティカルセクションでアトミック性を確保するための同期機構の一種である。

・クリティカルセクション(Critical section)とは、単一のリソースに対して、複数の処理が同時期に実行されると、破綻をきたす部分を指す。

・アトミック性とは次の2つの条件を満たす必要がある
・全操作が完了するまで、他のプロセスはその途中の状態を観測できない。

・一部操作が失敗したら組合せ全体が失敗し、システムの状態は不可分操作を行う前の状態に戻る。

synchronizesyncronizeとtypoすると、なぜかスレッドが止まる・・・ちょっとはまった

スレッドセーフなFIFOキュー(Queue)