POSIXスレッド
読み:ポジックス-スレッド
外語:pthread: POSIX thread
スレッドのPOSIX標準。pthreadと呼ばれる。
概要
pthreadはPOSIX仕様におけるスレッド処理の標準である。主としてUNIX含むPOSIXシステムで使われるが、Microsoft Windows用の実装も存在する。
Cから利用できる機能であり、ヘッダーファイルpthread.hと、ライブラリ(-lpthread)で構成されている。
pthread.hでは、PTHREADから始まる定数と、pthreadから始まるデータ型および関数のプロトタイプ宣言が定義される。
特徴
関数にせよデータ型にせよ、標準のものに加え、実装独自のものが多数ある。
/usr/include/pthread.hに定義があるが、FreeBSDの場合はデータ型等の定義は/usr/include/sys/_pthreadtypes.hにあり、pthread.hからincludeされている。
以下に、よく使うものを紹介する。
- データ型
- pthread_t ‐ スレッドのハンドル
- pthread_attr_t ‐ スレッドの属性
- pthread_mutex_t ‐ ミューテックスのハンドル
- 関数
- pthread_create() ‐ スレッドの生成
- pthread_exit() ‐ スレッドの終了
- pthread_mutex_init() ‐ ミューテックスの初期化
- pthread_mutex_destroy() ‐ ミューテックスの破棄
- pthread_mutex_lock() ‐ ミューテックスのロック獲得(ブロックあり)
- pthread_mutex_trylock() ‐ ミューテックスのロック獲得(ブロックなし)
- pthread_mutex_unlock() ‐ ミューテックスのロック解放
用法
使い方はシンプルで、あるCの関数を「スレッド関数」とし、これを一つのスレッドの起点として使う。
pthread_t thread;
pthread_create(&thread, NULL, thread_func, NULL);
第3引数がスレッド関数で、第4引数がスレッド関数に送られる引数(一つだけ)のポインターである。
実際のスレッド関数は、次のようになる。
void *thread_func (void *args)
{
...
return NULL;
}
pthread_createの第4引数がvoid *型の引数として与えられる。NULLを与えればスレッド関数側でももちろんNULLだが、さもなくばそれなりのポインターが渡される。従って、これをキャストして利用することになる。
スレッド関数はpthread_exit()で終了させるが、そのまま関数を抜けても自動的にpthread_exit()される。
なお、exit()を使った場合、マルチスレッドで無い場合と同様にプロセス自体が終了する。
引数
新しいスレッドに与えられる引数は一つのみだが、複数が必要な場合は構造体として、そのポインターを与えればよい。
引数は上述の通りvoid *型であるので、これをプログラマーの責任においてキャストして使うことになる。
なお、元のスレッドと新スレッドは同じプロセスとはいえスレッドが異なるので、つまりスタックは独立していてスレッドローカルになっている。引数にポインターを与える場合、元のスレッドのローカル変数であった場合は新スレッド側でそれを読み取ることができず誤動作する。この場合は、実体化して新スレッドに与える必要がある。
再検索