POSIXスレッド

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

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

## 内容
Pthreads はC言語のデータ型、関数、定数を定義している。その実装は `[http://opengroup.org/onlinepubs/007908799/xsh/pthread.h.html 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()`: 指定したスレッドの実行をキャンセル
* `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 を使ったコード例を示す。


```c
#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 と最近の動向について