Advanced Linux Programmingを流し読み。次はChapter 4 - Threads。知ってるところは簡単に。知らなかったところは詳しめに。
- 子プロセスの生成はメモリ空間やファイルディスクリプタなどを複製する
- pthreadの生成は一切の複製をせずに、プロセスのものと共有する
をインクルードしてビルド時に-lpthreadをつける - pthread(3)の使い方
- pthread_create( &pid, &pthread_attr, func, args )
- argsでfuncに引数を渡すことができるが、ひとつしか渡せないので構造体を作ること
- argsをスタティック領域に置くか、ヒープ領域に置くかきちんと考えること(生成元のスレッドが終了したとき、他のスレッドでもdeallocatedされるかも!)
- pthread_join( pid_t pid, void* return_value )
- 二番目の引数がNULLでない場合、返り値がセットされる
- 素数を計算するサンプル
- スレッドにはいろんな属性を定義できる
- はじめからdetachしとくとか
- pthread_exit
- pthread_cancel
- detachされてない場合、cancelしても後でjoinしなければならない
- pthread_setcanceltype
- transactionを実装してみたサンプル
- thread-specificなデータ領域?
- pthread_key_create
- pthread_setspecific / pthread_getspecific
- thread_log_key / write_to_thread_log / close_thread_log
- pthread_cleanup_push / pthread_cleanup_pop
- pthread_key_create
- race conditions
- mutex
- pthread_mutex_init / pthread_mutex_lock / pthread_mutex_unlock
- デッドロックに気をつけて
- recursive mutexはまあ安全, pthread_mutexattr_setkind_np
- pthread_mutex_trylock
- セマフォはカウンタ
- wait -> --, post -> ++
- sem == 0 -> block, sem > 0 -> go!
- GNU/Linuxには POSIX SemaphoreとProcess Semaphoresがある
- posix semaphoreのサンプル
- 負のセマフォはプロセス間で共有される感じだが、GNU/Linuxではサポートされない。
- 条件変数
- グローバル変数を適当にロックすればよいという実装もある(が、すき間が生まれる)
- pthread_cond_tという実装もある
- デッドロックの例:ふたつのスレッドがふたつのロックを取ろうとした場合
- GNU/Linuxでは他のUNIX系OSとは異なる実装で、プロセスとして実装されている(ただしアドレス空間は共有している)
- getpidしてみるとわかる(スレッドを管理するスレッドもプロセス中にいる)
- pthread_kill
- clone(2)
- プロセスvsスレッド
- プロセスは異なる実行プログラムを、スレッドは同じプログラムを実行する
- スレッドは他のスレッドに影響を及ぼすが、プロセスは他のプロセスとメモリ空間を共有していないので影響しない
- メモリ空間をコピーするのはオーバーヘッドなのでプロセスの方が重い
- threads -> fine-grained parallelism / processes -> coarser parallelism
- プロセス間でデータを共有するのはconcurrency的にはいささか楽(cumbersomeだけど)。