Documentation Home
> マルチスレッドのプログラミング
マルチスレッドのプログラミング
Book Information
はじめに
第 1 章 マルチスレッドの基礎
マルチスレッドに関する用語の定義
マルチスレッドの標準への適合
マルチスレッドの利点
アプリケーションの応答性の改善
マルチプロセッサの効率的な利用
プログラム構造の改善
システム資源の節約
スレッドと RPC の併用
マルチスレッドの基本概念
並行性と並列性
マルチスレッドの構造
ユーザレベルのスレッド
軽量プロセス
スケジューリング
プロセススコープ (非結合スレッド)
システムスコープ (結合スレッド)
取り消し
同期
第 2 章 スレッドを使った基本プログラミング
スレッドライブラリ
デフォルトのスレッドの生成
pthread_create(3T)
戻り値
スレッドの終了待ち
pthread_join(3T)
戻り値
簡単なスレッドの例
スレッドの切り離し
pthread_detach(3T)
戻り値
スレッド固有データ用キーの作成
pthread_key_create(3T)
戻り値
スレッド固有データキーの削除
pthread_key_delete(3T)
戻り値
スレッド固有データキーの設定
pthread_setspecific(3T)
戻り値
スレッド固有データキーの取得
pthread_getspecific(3T)
戻り値
スレッド固有データの広域性と局所性の例
スレッド識別子の取得
pthread_self(3T)
戻り値
スレッド識別子の比較
pthread_equal(3T)
戻り値
スレッドの初期化
pthread_once(3T)
戻り値
スレッドの実行明け渡し
sched_yield(3R)
戻り値
スレッド優先順位の設定
pthread_setschedparam(3T)
戻り値
スレッド優先順位の取得
pthread_getschedparam(3T)
戻り値
シグナルのスレッドへの送信
pthread_kill(3T)
戻り値
呼び出しスレッドのシグナルマスクの変更
pthread_sigmask(3T)
戻り値
安全な fork
pthread_atfork(3T)
スレッドの終了
pthread_exit(3T)
戻り値
スレッド終了処理の完了
取り消し
取り消しポイント
スレッドの取り消し
pthread_cancel(3T)
戻り値
取り消しを有効または無効にする
pthread_setcancelstate(3T)
戻り値
取り消しタイプの設定
pthread_setcanceltype(3T)
戻り値
取り消しポイントの設定
pthread_testcancel(3T)
スタックへハンドラをプッシュする
pthread_cleanup_push(3T)
スタックからハンドラを取り出す
pthread_cleanup_pop(3T)
第 3 章 スレッド生成時の属性設定
属性
属性の初期化
pthread_attr_init(3T)
戻り値
属性の削除
pthread_attr_destroy(3T)
戻り値
切り離し状態の設定
pthread_attr_setdetachstate(3T)
戻り値
切り離し状態の取得
pthread_attr_getdetachstate(3T)
戻り値
スコープの設定
pthread_attr_setscope(3T)
戻り値
スコープの取得
pthread_attr_getscope(3T)
戻り値
スケジューリング方針の設定
pthread_attr_setschedpolicy(3T)
戻り値
スケジューリング方針の取得
pthread_attr_getschedpolicy(3T)
戻り値
継承スケジューリング方針の設定
pthread_attr_setinheritsched(3T)
戻り値
継承スケジューリング方針の取得
pthread_attr_getinheritsched(3T)
戻り値
スケジューリングパラメタの設定
pthread_attr_setschedparam(3T)
戻り値
スケジューリングパラメタの取得
pthread_attr_getschedparam(3T)
戻り値
指定の優先順位をもつスレッドを生成する
スタックの大きさの設定
pthread_attr_setstacksize(3T)
戻り値
スタックの大きさの取得
pthread_attr_getstacksize(3T)
戻り値
スタックについて
独自のスタックを構築する
スタックアドレスの設定
pthread_attr_setstackaddr(3T)
戻り値
スタックアドレスの取得
pthread_attr_getstackaddr(3T)
戻り値
第 4 章 同期オブジェクトを使ったプログラミング
相互排他ロック属性
mutex 属性オブジェクトの初期化
pthread_mutexattr_init(3T)
戻り値
mutex 属性オブジェクトの削除
pthread_mutexattr_destroy(3T)
戻り値
mutex のスコープ設定
pthread_mutexattr_setpshared(3T)
戻り値
mutex のスコープの値の取得
pthread_mutexattr_getpshared(3T)
戻り値
相互排他ロックの使用方法
mutex の初期化
pthread_mutex_init(3T)
戻り値
mutex のロック
pthread_mutex_lock(3T)
戻り値
mutex のロック解除
pthread_mutex_unlock(3T)
戻り値
ブロックしないで行う mutex のロック
pthread_mutex_trylock(3T)
戻り値
mutex の削除
pthread_mutex_destroy(3T)
戻り値
相互排他ロックのコード例
ロック階層の使用
片方向リンクリストの入れ子のロック
循環リンクリストの入れ子のロック
条件変数の属性
条件変数の属性の初期化
pthread_condattr_init(3T)
戻り値
条件変数の属性の削除
pthread_condattr_destroy(3T)
戻り値
条件変数のスコープの設定
pthread_condattr_setpshared(3T)
戻り値
条件変数のスコープの取得
pthread_condattr_getpshared(3T)
戻り値
条件変数の使用方法
条件変数の初期化
pthread_cond_init(3T)
戻り値
条件変数によるブロック
pthread_cond_wait(3T)
戻り値
特定のスレッドのブロック解除
pthread_cond_signal(3T)
戻り値
時刻指定のブロック
pthread_cond_timedwait(3T)
戻り値
全スレッドのブロック解除
pthread_cond_broadcast(3T)
戻り値
条件変数に対するブロードキャストの例
条件変数の削除
pthread_cond_destroy(3T)
戻り値
「呼び起こし忘れ」問題
「生産者 / 消費者」問題
セマフォ
計数型セマフォ
セマフォの初期化
sem_init(3R)
戻り値
プロセス間スコープでセマフォを初期化する
プロセス間スコープでセマフォを初期化する
名前付きセマフォ
セマフォの加算
sem_post(3R)
戻り値
セマフォの値によるブロック
sem_wait(3R)
戻り値
セマフォの減算
sem_trywait(3R)
戻り値
セマフォの削除
sem_destroy(3R)
戻り値
「生産者 / 消費者」問題 − セマフォを使った例
プロセスの境界を越えた同期
「生産者 / 消費者」問題の例
スレッドライブラリによらないプロセス間ロック
プリミティブの比較
第 5 章 オペレーティングシステムが関係するプログラミング
プロセスの生成 − fork
fork1 モデル
fork1 モデルにおける安全性の問題とその解決策
仮想 fork − vfork(2)
解決策 − pthread_atfork(3T)
戻り値
汎用 fork モデル
正しい fork の選択
すべての fork に関係する注意事項
プロセスの作成 − exec(2) と exit(2) について
タイマ、アラーム、およびプロファイル
LWP ごとの POSIX タイマ
スレッドごとのアラーム
プロファイル
大域ジャンプ − setjmp(3C) と longjmp(3C)
資源の制限
LWP とスケジューリングクラス
タイムシェアスケジューリング
リアルタイムスケジューリング
LWP のスケジューリングとスレッドの結合
SIGWAITING − 待ち状態のスレッドのための LWP の生成
LWP の存在時間
シグナルの拡張
同期シグナル
非同期シグナル
継続セマンティクス法
シグナルに関する新しい操作
pthread_sigsetmask(3T)
pthread_kill(3T)
sigwait(2)
新しい sigwait の実装
sigtimedwait(2)
スレッド指定シグナル
完了セマンティクス法
シグナルハンドラと「非同期シグナル安全」
条件変数で待っているときの割り込み (Solaris スレッドのみ)
入出力の問題
遠隔手続き呼び出しとしての入出力
非同期性の管理
非同期入出力
非同期入出力操作
共有入出力と新しい入出力システムコール
getc(3S) と putc(3S) の代替関数と代替マクロ
第 6 章 安全なインタフェースと安全ではないインタフェース
「スレッド安全」
マルチスレッドインタフェースの安全レベル
「安全ではない」インタフェースのためのリエントラント関数
「非同期シグナル安全」関数
ライブラリの「MT-安全」レベル
「スレッド安全ではない」ライブラリ
第 7 章 コンパイルとデバッグ
マルチスレッドアプリケーションのコンパイル
コンパイルの準備
セマンティクスの選択 − Solaris または POSIX
<thread.h> または <pthread.h> の組み込み
_REENTRANT または _POSIX_C_SOURCE の指定
libthread または libpthread とのリンク
リンク時の POSIX セマフォ用 -lposix4 の指定
新旧のモジュールのリンク
マルチスレッドプログラムのデバッグ
よく起こるミス
TNF ユーティリティによる追跡とデバッグ
truss(1) の使用
adb(1) の使用
dbx の使用
第 8 章 MT プログラム開発用ツール
第 9 章 Solaris スレッドを使ったプログラミング
Solaris スレッドと POSIX スレッドの API の比較
API の主な相違点
関数比較表
Solaris スレッドに固有の関数
スレッド実行の停止
thr_suspend(3T)
戻り値
停止しているスレッドの再開
thr_continue(3T)
戻り値
スレッドの並行度の設定
thr_setconcurrency(3T)
戻り値
スレッドの並行度の取得
thr_getconcurrency(3T)
戻り値
Solaris に固有の同期関数 − 読み取り / 書き込みロック
読み取り / 書き込みロックの初期化
rwlock_init(3T)
プロセス内スコープでの読み取り / 書き込みロックの初期化
プロセス間スコープでの読み取り / 書き込みロックの初期化
戻り値
読み取りロックの獲得
rw_rdlock(3T)
戻り値
読み取りロックの獲得 (ブロックなし)
rw_tryrdlock(3T)
戻り値
書き込みロックの獲得
rw_wrlock(3T)
戻り値
書き込みロックの獲得
rw_trywrlock(3T)
戻り値
読み取り / 書き込みロックの解除
rw_unlock(3T)
戻り値
読み取り / 書き込みロックの削除
rwlock_destroy(3T)
戻り値
読み取り / 書き込みロックの例
pthread に相当するものがある Solaris スレッドの関数
スレッドの生成
thr_create(3T)
戻り値
スタックの動作
最小のスタックの大きさの取得
thr_min_stack(3T)
スレッド識別子の取得
thr_self(3T)
スレッドの実行明け渡し
thr_yield(3T)
シグナルのスレッドへの送信
thr_kill(3T)
呼び出しスレッドのシグナルマスクのアクセス
thr_sigsetmask(3T)
スレッドの終了
thr_exit(3T)
スレッドの終了待ち
thr_join(3T)
指定したスレッドの終了待ち
任意のスレッドの終了待ち
スレッド固有データ用キーの作成
thr_keycreate(3T)
スレッド固有データ用キーの設定
thr_setspecific(3T)
スレッド固有データ用キーの取得
thr_getspecific(3T)
スレッド優先順位の設定
thr_setprio(3T)
スレッド優先順位の取得
thr_getprio(3T)
pthread に相当するものがある同期関数 − 相互排他ロック
mutex の初期化
mutex_init(3T)
プロセス内スコープでの mutex
プロセス間スコープでの mutex
mutex の削除
mutex_destroy(3T)
mutex の獲得
mutex_lock(3T)
mutex の解除
mutex_unlock(3T)
mutex の獲得 (ブロックなし)
mutex_trylock(3T)
pthread に相当するものがある同期関数 − 条件変数
条件変数の初期化
cond_init(3T)
プロセス内スコープでの条件変数
プロセス間スコープでの条件変数
条件変数の削除
cond_destroy(3T)
条件変数によるブロック
cond_wait(3T)
指定時刻のブロック
cond_timedwait(3T)
特定のスレッドのブロック解除
cond_signal(3T)
全スレッドのブロック解除
cond_broadcast(3T)
pthread に相当するものがある同期関数 − セマフォ
セマフォの初期化
sema_init(3T)
プロセス内スコープでのセマフォ
プロセス間スコープでのセマフォ
セマフォの加算
sema_post(3T)
セマフォの値によるブロック
sema_wait(3T)
セマフォの減算
sema_trywait(3T)
セマフォの削除
sema_destroy(3T)
プロセスの境界を越えた同期
プロセス間での LWP の使用
「生産者 / 消費者」問題の例
fork() とSolaris スレッドに関する問題
第 10 章 プログラミング上の指針
広域変数の考慮
静的局所変数の利用
スレッドの同期
シングルスレッド化
リエントラント (再入可能)
コードロック
データロック
不変式
デッドロックの回避
デッドロックのスケジューリング
ロックに関する指針
その他の基本的な指針
スレッドの生成と使用
軽量プロセス (LPW)
非結合スレッド
結合スレッド
スレッドの並行度 (Solaris スレッドの場合のみ)
効率
スレッドの生成に関する指針
マルチプロセッサへの対応
アーキテクチャ
共有メモリー型のマルチプロセッサ
Peterson のアルゴリズム
共有メモリー型の並列コンピュータでのループの並列化
まとめ
参考資料
付録 A アプリケーションの例 − マルチスレッド化された grep
tgrep の説明
オンラインソースコードの入手方法
付録 B Solaris スレッドの例 − barrier.c
付録 C 「MT-安全」ライブラリインタフェース
ライブラリルーチンの「MT-安全」レベル (A)
ライブラリルーチンの「MT-安全」レベル (B)
ライブラリルーチンの「MT-安全」レベル (C)
ライブラリルーチンの「MT-安全」レベル (D)
ライブラリルーチンの「MT-安全」レベル (E)
ライブラリルーチンの「MT-安全」レベル (F)
ライブラリルーチンの「MT-安全」レベル (G)
ライブラリルーチンの「MT-安全」レベル (H)
ライブラリルーチンの「MT-安全」レベル (I)
ライブラリルーチンの「MT-安全」レベル (J)
ライブラリルーチンの「MT-安全」レベル (K)
ライブラリルーチンの「MT-安全」レベル (L)
ライブラリルーチンの「MT-安全」レベル (M)
ライブラリルーチンの「MT-安全」レベル (N)
ライブラリルーチンの「MT-安全」レベル (O)
ライブラリルーチンの「MT-安全」レベル (P)
ライブラリルーチンの「MT-安全」レベル (Q)
ライブラリルーチンの「MT-安全」レベル (R)
ライブラリルーチンの「MT-安全」レベル (S)
ライブラリルーチンの「MT-安全」レベル (T)
ライブラリルーチンの「MT-安全」レベル (U)
ライブラリルーチンの「MT-安全」レベル (V)
ライブラリルーチンの「MT-安全」レベル (W)
ライブラリルーチンの「MT-安全」レベル (X)
ライブラリルーチンの「MT-安全」レベル (Y)
索引
数字・記号
A
C
D
E
F
G
K
L
M
N
P
R
S
T
U
V
W
X
あ
い
え
か
き
け
こ
さ
し
す
せ
そ
た
ち
つ
て
と
に
は
ひ
ふ
へ
ほ
ま
め
も
ゆ
よ
ら
り
れ
ろ
わ
© 2010, Oracle Corporation and/or its affiliates