とりあえず、pthread.h から、pthread の内容を探る
内部で、読み込んでいる、他のヘッダーファイル
features.h
sched.h
time.h
signal.h
bits/pthreadtypes.h
bits/initspin.h
スレッドの操作関数
- スレッドの作成
-
int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine) (void *),void *arg)
与えられた pthread_attr_t (default = NULL) でスレッドを作成して、第三引数で渡された関数を第四引数で渡されたものを引数として実行する。
- カレントのスレッドのIDを返す
-
pthread_t pthread_self(void)
- 2つのスレッドのIDを比較する。
-
int pthread_equal (pthread_t thread1, pthread_t thread2)
同じスレッドを指しているなら、0以外、違うスレッドなら 0 が返る
- 呼び出したスレッドを終了する。
-
void pthread_exit (void *retval )
- 別のスレッドの終了を待つ。
-
int pthread_join (pthread_t th, void **retval)
th で指定した、スレッドが終了するまで待つ。終了したスレッドの戻り値は retval に格納される。
指定されたスレッドが中断された場合は、PTHREAD_CANCELEDが返ってくる。
- 指定したスレッドをデタッチ状態にする。
-
int pthread_detach (pthread_t th)
thで指定されたスレッドが終了した時に、即座に獲得していたリソースを開放するように印を付ける
ただ、デタッチ状態にすると、pthread_join で同期をとれなくなるし、他のスレッドが th のスレッドを pthread_join で待っているなら、pthread_detachは何もしない。
スレッド属性オブジェクトの操作関数
- スレッド属性オブジェクトの標準値(default値)をattrに設定する。
-
int pthread_attr_init (pthread_attr_t *attr)
標準値は
detachstate is PTHREAD_JOINABLE
scheduling policy is SCHED_OTHER
no user-provided stack
- スレッド属性オブジェクトを壊す
-
int pthread_attr_destroy (pthread_attr_t *attr)
ただし、Linux では、なにもしない(らしい)
- デタッチ情報の定数
-
PTHREAD_CREATE_JOINABLE pthread_join で同期可能にする
PTHREAD_CREATE_DETACHED デタッチ状態でスレッドを作成する
- スレッド属性オブジェクトにデタッチ情報を設定する。
-
int pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate)
- スレッド属性オブジェクトからデタッチ情報をとってくる
-
int pthread_attr_getdetachstate ( pthread_attr_t *attr, int *detachstate)
- スケジューリングポリシー用の定数
-
SCHED_OTHER:通常のスレッド処理
SCHED_FIFO:FIFO方式のリアルタイム処理(root権限で実行)
SCHED_RR:RR(ラウンドロビン)方式のリアルタイム処理(root権限で実行)
- スケジューリング継承用の定数
-
PTHREAD_INHERIT_SCHED : 親スレッドから継承する
PTHREAD_EXPLICIT_SCHED : 個別にスケジューリング設定をする(継承しない)
- スケジューリング競合用のスコープ定義定数
-
PTHREAD_SCOPE_SYSTEM:システム上の全てのスレッドが対象
PTHREAD_SCOPE_PROCESS:同一プロセス内で競合を解決する?(Linuxでは実装していないらしい)
- スレッド属性オブジェクトにスケジューリングを設定する
-
int pthread_attr_setschedparam (pthread_attr_t *attr,sched_param *param)
- スレッド属性オブジェクトからスケジューリングを取得する
-
int pthread_attr_getschedparam (pthread_attr_t *attr,sched_param *param)
- スレッド属性オブジェクトにスケジューリングポリシーを設定する
-
int pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy)
- スレッド属性オブジェクトからスケジューリングポリシーを取得する
-
int pthread_attr_getschedpolicy ( pthread_attr_t *attr, int *policy)
- スレッド属性オブジェクトにスケジューリングの継承情報を設定する
-
int pthread_attr_setinheritsched (pthread_attr_t *attr, int inherit)
- スレッド属性オブジェクトにスケジューリングの継承情報を取得する
-
int pthread_attr_getinheritsched (pthread_attr_t *attr, int *inherit)
- 生成されるスレッドのスケジューリング競合スコープを設定する
-
int pthread_attr_setscope (pthread_attr_t *attr, int scope)
- 生成されるスレッドのスケジューリング競合スコープを取得する
-
int pthread_attr_getscope ( pthread_attr_t *attr, int *scope)
スケジュール制御用の関数
- 指定したスレッドにスケジューリングポリシー他を設定する。
-
int pthread_setschedparam (pthread_t th, int policy, sched_param *param)
- 指定したスレッドにスケジューリングポリシー他を取得する。
-
int pthread_getschedparam (pthread_t th, int *policy, sched_param *param)
MUTEX制御用の関数
- MUTEX
- スレッド間で共有データの保護等に使用される仕組みです。
- MUTEXの初期化
-
int pthread_mutex_init (pthread_mutex_t *mutex, pthread_mutexattr_t *mutex_attr)
いろいろな初期化マクロ関数
PTHREAD_MUTEX_INITIALIZER()
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP()
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP()
PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP()
- MUTEXの破棄
-
int pthread_mutex_destroy (pthread_mutex_t *mutex)
- MUTEXロックを試行する。
-
int pthread_mutex_trylock (pthread_mutex_t *mutex)
- MUTEXのロックする。(ロックできるまで待つ)
int pthread_mutex_lock (pthread_mutex_t *mutex)
- MUTEXをロックする、タイムアウト機能付き
- ロックできなければ、引数abstimeで指定された時間だけ待つ。
int pthread_mutex_timedlock (pthread_mutex_t *mutex, timespec *abstime)
- MUTEXのロックを解除する。
-
int pthread_mutex_unlock (pthread_mutex_t *mutex)
- MUTEXのタイプ属性用の定数マクロ
-
PTHREAD_MUTEX_TIMED_NP
PTHREAD_MUTEX_RECURSIVE_NP
PTHREAD_MUTEX_ERRORCHECK_NP
PTHREAD_MUTEX_ADAPTIVE_NP
PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP
PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP
PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP
PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
互換性を保つために FAST定義もしておく
PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_ADAPTIVE_NP
- MUTEX属性オブジェクトの標準値の設定
-
int pthread_mutexattr_init (pthread_mutexattr_t *attr)
- MUTEX属性オブジェクトの破棄
-
int pthread_mutexattr_destroy (pthread_mutexattr_t *attr)
- MUTEX属性内のプロセス共有フラグの情報を取得する
-
int pthread_mutexattr_getpshared( pthread_mutexattr_t *attr, int *pshared)
- MUTEX属性内のプロセス共有フラグの情報を設定する
-
int pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int pshared)
- MUTEXオブジェクトの種類を示す定数マクロ
-
PTHREAD_MUTEX_NORMAL
PTHREAD_MUTEX_RECURSIVE
PTHREAD_MUTEX_ERRORCHECK
PTHREAD_MUTEX_DEFAULT
- MUTEXオブジェクトの種類を設定する。
-
int pthread_mutexattr_settype (pthread_mutexattr_t *attr, int kind)
- MUTEXオブジェクトの種類を取得する。
int pthread_mutexattr_gettype (pthread_mutexattr_t *attr, int *kind)
CONDオブジェクトの操作関数
- CONDオブジェクト
- MUTEXを利用して、スレッドが COND の条件を満たすまでスレッドを実行しないように
する仕組み(らしい)。でもLinuxでどこまで対応(実装)されているか不明
- CONDオブジェクトの初期化(標準値を設定する)
-
int pthread_cond_init (pthread_cond_t *cond, pthread_condattr_t *cond_attr)
CONDオブジェクト初期化のマクロ関数
PTHREAD_COND_INITIALIZER()
- CONDオブジェクトの破棄
-
int pthread_cond_destroy (pthread_cond_t *cond)
- CONDオブジェクトの条件待ちになっているスレッド一つを実行させる。
-
int pthread_cond_signal (pthread_cond_t *cond)
- CONDオブジェクトの条件待ちになっているスレッド全部を実行させる。
int pthread_cond_broadcast (pthread_cond_t *cond)
- スレッドを待機させる、(その前にMUTEXを unlock状態にする。)
-
int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)
- スレッドを指定時間だけ待機させる、(その前にMUTEXを unlock状態にする。)
-
int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, timespec *abstime)
- COND属性の初期化(標準値の設定)
-
int pthread_condattr_init (pthread_condattr_t *attr)
- COND属性の破棄
-
int pthread_condattr_destroy (pthread_condattr_t *attr)
- COND属性の中からプロセス共有フラグの情報を取得する
-
int pthread_condattr_getpshared (pthread_condattr_t *attr, int *pshared)
- COND属性の中からプロセス共有フラグの情報を設定する
-
int pthread_condattr_setpshared (pthread_condattr_t *attr,int pshared)
R/Wロックの制御関数
- RWLOCK
RWLOCKは、スレッド間で共有する領域の書き込み、読み込みを制御して競合しないようにする
仕組み(らしいです)。
- RWLOCKオブジェクトの初期化(標準値の設定)
-
int pthread_rwlock_init (pthread_rwlock_t *rwlock, pthread_rwlockattr_t *attr)
RWLOCKオブジェクトの初期化マクロ関数
PTHREAD_RWLOCK_INITIALIZER
PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP
- RWLOCKオブジェクトの破棄
-
int pthread_rwlock_destroy (pthread_rwlock_t *rwlock)
- RWLOCKオブジェクトの読み込みをロックする。
-
int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
- RWLOCKオブジェクトの読み込みロックを試行する。
-
int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
- RWLOCKオブジェクトの読み込みロックを試行し、指定時間内にロックできなければタイムアウトする。
-
int pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,timespec *abstime)
- RWLOCKオブジェクトの書き込みをロックする。
int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
- RWLOCKオブジェクトの書き込みロックを試行する。
-
int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock)
- RWLOCKオブジェクトの読み込みロックを試行し、指定時間内にロックできなければタイムアウトする。
-
int pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,timespec *abstime)
- RWLOCKオブジェクトのロック解除
-
int pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
- RWLOCK属性オブジェクトの初期化(標準値の設定)
-
int pthread_rwlockattr_init (pthread_rwlockattr_t *attr)
- RWLOCK属性オブジェクトの破棄
-
int pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr)
- プロセスの共有属性用の定数マクロ
-
PTHREAD_PROCESS_PRIVATE
PTHREAD_PROCESS_SHARED
- RWLOCK属性オブジェクト内の共有情報を取得する。
-
int pthread_rwlockattr_getpshared (pthread_rwlockattr_t *attr,int *pshared)
- RWLOCK属性オブジェクト内の共有情報を設定する。
int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr,int pshared)
- RWLOCK属性オブジェクトの種別を取得する
-
int pthread_rwlockattr_getkind_np (pthread_rwlockattr_t *attr,int *pref)
- RWLOCK属性オブジェクトの種別を設定する
int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *attr,int pref)
SPINLOCK関連関数
- SPINLOCKオブジェクトの初期化
-
int pthread_spin_init (pthread_spinlock_t *lock, int pshared)
引数 pshared が0以外なら、生成したspinlockは共有されます。
- SPINLOCKの破棄
-
int pthread_spin_destroy (pthread_spinlock_t *lock)
- SPINLOCKを LOCK する。
-
int pthread_spin_lock (pthread_spinlock_t *lock)
- SPINLOCKの LOCK を試行する。
int pthread_spin_trylock (pthread_spinlock_t *lock)
- SPINLOCKの LOCKを開放する。
-
int pthread_spin_unlock (pthread_spinlock_t *lock)
バリアー操作関数
現在、ドキュメント検索中。
- BARRIERの初期化
-
int pthread_barrier_init (pthread_barrier_t *barrier,pthread_barrierattr_t *attr, unsigned int count)
- BARRIERの破棄
-
int pthread_barrier_destroy (pthread_barrier_t *barrier)
- BARRIERを待つ?
-
int pthread_barrier_wait (pthread_barrier_t *barrier)
- BARRIER属性の初期化
-
int pthread_barrierattr_init (pthread_barrierattr_t *attr)
- BARRIER属性オブジェクトの破棄
-
int pthread_barrierattr_destroy (pthread_barrierattr_t *attr)
- BARRIER属性の中から共有フラグを取得する
-
int pthread_barrierattr_getpshared (pthread_barrierattr_t *attr, int *pshared)
- BARRIER属性の中から共有フラグを設定する
-
int pthread_barrierattr_setpshared (pthread_barrierattr_t *attr,int pshared)
スレッドの同時並列性を操作する関数
- スレッドの同時並列性を取得します。
-
pthread_setconcurrency で設定した、並列性レベルを取得します。
int pthread_getconcurrency (void)
- スレッドの同時並列性を設定します。
-
extern int pthread_setconcurrency (int level)
スレッドのキー操作関数
- キーの生成
-
スレッド固有のキーを作成します。destr_functionでデストラクタを指定すると、指定されたキーを
持つスレッドが終了した時にデストラクタを呼びます。
デストラクタの指定が必要ない場合は、 NULL を指定します。
また、キーをこの関数で create した時には NULL で初期化されていますので、スレッドと結びつける
時には、pthread_specific を使用します。
int pthread_key_create (pthread_key_t *key, void (*destr_function) (void *))
- キーの破棄
-
int pthread_key_delete (pthread_key_t key)
- キーに値を設定する。
-
pthread_key_create で作成した key に (*poiner) を格納します。
int pthread_setspecific (pthread_key_t key, void *pointer)
- キーの内容を参照します。
-
void *pthread_getspecific (pthread_key_t key)
スレッドの初期化制御関数
- 初期化が一回しか実行できないようにする。
-
引数initで指定された関数が一回しか実行されないように保証する仕組みです。
引数once_control は PTHREAD_ONCE_INIT で初期化する必要があります。
int pthread_once (pthread_once_t *once_control, void (*__init_routine) (void))
スレッドの中断処理
- 中断可能フラグを設定する
-
引数 state を新しい中断可能フラグに設定する、今までの設定があれば(NULLでなければ)
oldstate に書き込まれる。
int pthread_setcancelstate (int state, int *oldstate)
state設定用の定数マクロ
PTHREAD_CANCEL_ENABLE
PTHREAD_CANCEL_DISABLEM
- 中断の仕方を設定する。
- カレントスレッドの中断の仕方を type にします、もし古い設定があれば、oldtype に代入され
ます。
int pthread_setcanceltype (int type, int *oldtype)
引数type用の定数マクロ
PTHREAD_CANCEL_DEFERRED
PTHREAD_CANCEL_ASYNCHRONOUS
- スレッドを中断します。
-
int pthread_cancel (pthread_t cancelthread)
- 中断保留中のスレッドがあれば、中断する。
-
void pthread_testcancel (void)
クリーンアップハンドラーの操作。
- クリーンアップハンドラー
- スレッドが終了する時に、この cleanup handler が設定されていれば実行される。
スレッド実行中に確保したリソースなどが、開放されないまま居残りになるのを防ぐ用途らしい
- クリーンアップハンドラーの登録
-
引数routineを、引数argを引数としてクリーンアップハンドラーに登録します。
pthread_cleanup_push(routine,arg)
- クリーンアップハンドラーの登録削除
-
引数 execute が0以外の場合、削除される関数を実行します。
pthread_cleanup_pop(execute)
- クリーンアップハンドラーの登録+取消タイプの保存変更
-
クリーンアップハンドラーを登録します、この関数では登録されたハンドラーの取消情報を保存しておき
新しく、取消情報を deferred(遅延)にします。
この関数は、pthread_cleanup_pop_restore_np(execute)とペアで使用します。
pthread_cleanup_push_defer_np(routine,arg)
- クリーンアップハンドラーの取消+取消タイプの復旧
-
pthread_cleanup_push_defer_np(routine,arg) で保存された情報をもとに、クリーンアップ
ハンドラーを削除します。deferred になっていた取消情報は、保存されていた取消情報に復活します
引数 execute が0以外なら、クリーンアップハンドラーを実行します。
define pthread_cleanup_pop_restore_np(execute)
CPU占有時間を取得する
- 指定したスレッドのCPU占有時間を取得する
-
id で指定したスレッドのCPU占有時間を clock_id に格納する。(?)
int pthread_getcpuclockid (pthread_t id, clockid_t *clock_id)
プロセス生成、実行の制御関数
- forkでスレッドが起動した時の、起動時、終了時に実行する関数を設定する。
-
引数 prepare は fork で起動する時に実行される関数
引数 parent は fork されたスレッドが終了する時に親プロセスが実行する関数
引数 child は fork されたスレッドが終了する時に子プロセスが実行する関数
int pthread_atfork (void (*prepare) (void),void (*parent) (void),void (*child) (void))
- 呼び出しスレッド以外の全てのスレッドを終了させる。
-
void pthread_kill_other_threads_np (void)
あまり使いそうにないので、名前だけ
int pthread_attr_setguardsize (pthread_attr_t *attr, size_t guardsize)
int pthread_attr_getguardsize (pthread_attr_t *attr, size_t *guardsize)
int pthread_attr_setstackaddr (pthread_attr_t *attr, void *stackaddr)
int pthread_attr_getstackaddr (pthread_attr_t *attr, void **stackaddr)
int pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, size_t stacksize)
int pthread_attr_getstack (pthread_attr_t *attr, void **stackaddr, size_t *stacksize)
int pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize)
int pthread_attr_getstacksize (pthread_attr_t *attr, size_t *stacksize)
定義はあるけど、別の関数の使用が推奨されているもの
int pthread_yield (void)
以下は、よくわからん+ドキュメント作成中の残り
enum
{
PTHREAD_RWLOCK_PREFER_READER_NP,
PTHREAD_RWLOCK_PREFER_WRITER_NP,
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP
};
#define PTHREAD_BARRIER_SERIAL_THREAD -1
/* Cleanup buffers */
struct _pthread_cleanup_buffer
{
void (*__routine) (void *); /* Function to call. */
void *__arg; /* Its argument. */
int __canceltype; /* Saved cancellation type. */
struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions. */
};