POSIXスレッド

POSIXスレッド は、スレッドのPOSIX標準である。スレッド生成やスレッド操作の API を定義している。

POSIXスレッド標準を実装したライブラリは Pthreads と呼ばれることが多い。Pthreads は主にUnix系POSIXシステム（Linux や Solaris）で使われているが、Microsoft Windows 用実装も存在する。例えば、pthreads-w32 は Pthreads の API のサブセットをサポートしているPOSIX Threads (pthreads) for Win32。

 内容 
Pthreads はC言語のデータ型、関数、定数を定義している。その実装は pthread.h というヘッダファイルとスレッドライブラリにある。スレッドのスリープは unistd.h の sleep() もしくは time.h の nanosleep() を使用する。

データ型:
 pthread_t: スレッドへのハンドル
 pthread_attr_t: スレッド属性
 pthread_mutex_t: mutex
 pthread_mutexattr_t: mutex の属性
 pthread_cond_t: 条件変数
 pthread_condattr_t: 条件変数の属性

スレッド操作関数（引数は省略）:
 pthread_create(): スレッド生成
 pthread_exit(): 現在のスレッドを終了
 pthread_cancel(): 指定したスレッドの実行をキャンセルあるスレッドを、そのデータのクリーンアップを含め、それ以外のスレッドによる非同期的な処理により終了させること。POSIXプロセスがシステムコール等をそれ自身により発行しなければ終了しないのとは対照的な仕様。
 pthread_join(): 現在のスレッドを他のスレッドが終了するまでブロック
 pthread_kill(): スレッドへのシグナル送信
 pthread_attr_init(): スレッド属性を初期化
 pthread_attr_destroy(): スレッド属性の破棄
 pthread_attr_getdetachstate(): detachstate属性を取得
 pthread_attr_setdetachstate(): datachstate属性（スレッドがjoinできるかどうか）を設定

同期関数: mutex
 pthread_mutex_init(): mutexロックの初期化
 pthread_mutex_destroy(): mutexロックの破棄
 pthread_mutex_lock(): mutexロックの獲得（ブロックあり）
 pthread_mutex_trylock(): mutexロックの獲得（ブロックしない）
 pthread_mutex_unlock(): mutexロックの解放
 pthread_mutex_getprioceiling():
 pthread_mutex_setprioceiling():

同期関数: 条件変数
 pthread_cond_init(): 条件変数の初期化
 pthread_cond_destroy(): 条件変数の破棄
 pthread_cond_signal(): 条件変数のシグナル
 pthread_cond_broadcast():
 pthread_cond_wait(): 条件変数で待つ
 pthread_cond_timedwait(): 
 pthread_condattr_init(): 
 pthread_condattr_destroy(): 
 pthread_condattr_getpshared(): 
 pthread_condattr_setpshared(): 

スレッドローカルデータ:
 pthread_key_create(): スレッドローカルデータと関連付けるキーを生成
 pthread_key_delete(): キーの破棄
 pthread_getspecific(): キーを指定してスレッドローカルデータを検索
 pthread_setspecific(): キーとスレッドローカルデータの関連付け

Read/Writeロック
 pthread_rwlock_init():
 pthread_rwlock_destroy():
 pthread_rwlock_rdlock():
 pthread_rwlock_wrlock():
 pthread_rwlock_tryrdlock():
 pthread_rwlock_trywrlock():
 pthread_rwlock_unlock():
 pthread_rwlockattr_init():
 pthread_rwlockattr_destroy():
 pthread_rwlockattr_getpshared():
 pthread_rwlockattr_setpshared():

ユーティリティ関数:
 pthread_equal(): 2つのスレッドIDが等しいかどうかを調べる
 pthread_detach(): スレッドにリソースを解放させる
 pthread_self(): 自身のスレッドIDを得る

 例 
C言語で Pthreads を使ったコード例を示す。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

static void *thread_func(void *vptr_args) {
    int i;

    for (i = 0; i < 20; i++) {
        fputs("  b\n", stderr);
        sleep(1);
    }

    return NULL;
}

int main(void) {
    int i;
    pthread_t thread;

    if (pthread_create(&thread, NULL, thread_func, NULL) != 0) {
        return EXIT_FAILURE;
    }

    for (i = 0; i < 20; i++) {
        puts("a");
        sleep(1);
    }

    if (pthread_join(thread, NULL) != 0) {
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

このプログラムは、'b' を1秒ごとに20回表示する新たなスレッドを生成し、同時にメインスレッドは 'a' を1秒ごとに20回表示する。出力は、2つのスレッドが並行動作することで 'a' と 'b' が入り混じったものになる。

 関連項目 
 Native POSIX Thread Library (NPTL)

 参考文献 
 David R. Butenhof: Programming with POSIX Threads, Addison-Wesley, ISBN 0-201-63392-2
 Bradford Nichols, Dick Buttlar, Jacqueline Proulx Farell: Pthreads Programming, O'Reilly & Associates, ISBN 1-56592-115-1
 Charles J. Northrup: Programming with UNIX Threads, John Wiley & Sons, ISBN 0-471-13751-0
 Kay A. Robbins and Steven Robbins, UNIX Systems Programming, Prentice-Hall, ISBN 0-13-042411-0

 脚注 

 外部リンク 
 POSIX Threads Programming
 C/C++ Tutorial: using Pthreads
 "POSIX threads explained" by Daniel Robbins (Gentoo Linux founder)
 インタビュー "Ten Questions with David Butenhof about Parallel Programming and POSIX Threads" by Michael Suess
 Open Source POSIX Threads for Win32
 The Open Group Base Specifications Issue 6, IEEE Std 1003.1
 GNU Portable threads
 Pthreads Presentation at 2007 OSCON (O'Reilly Open Source Convention) by Adrien Lamothe. Pthreads と最近の動向について

Category:POSIX
Category:並行計算
Category:スレッド (コンピュータ)