pthread
pthread とは、POSIXスレッドのことで、POSIX標準のスレッドです。pthreadは、Unix系(Linux,FreeBSD)などで使われます。C言語でスレッドプログラミングをするときに使用されるCライブラリです。スレッドを使用することで、プログラムを並列的に動かすことができます。プロセスを作成するforkとの違いは、スレッドは同じメモリ空間で動作するため、プロセスのリソースが共有されるということです。
読み方
- pthread
- ぴーすれっど
- マルチスレッド
- まるちすれっど
- マルチスレッドプログラミング
- まるちすれっど ぷろぐらみんぐ
- Multi Thread
- まるちすれっど
- Multi Thread Proggraming
- まるちすれっど ぷろぐらみんぐ
目次
概要
スレッドとは
スレッドは、「軽量プロセス」とも呼ばれます。 スレッドプログラムとマルチプロレスのプログラムの主な違いは、スレッドは、同じメモリ空間でリソースを共有することです。
マルチスレッドの利点
- アプリケーションの応答性が改善できる
- リステムリソースを節約できる
- スレッド同士でデータを共有できる
シングルプロセスのプログラムでは、1つ1つの処理が終わるまで、次の処理がはじまりません。待たされるような処理が複数ある場合、それを1つ1つ順番に実行すると、プログラムの実行時間は、それらの総和の時間とイコールになります。
依存関係のない「待たされる処理」を並列で実行した場合、プログラムの実行時間は、「待たされる処理」の最長の時間だけにできるかもしれません。複数のデータベースに問い合わせるようなプログラムであれば、同時にすべてのデータベースに問い合わせをして、プログラムは、それらが返ってくるのを待てばいいわけです。
マルチプロセスの利点
マルチプロセスは、ある意味では、コーディングが単純化され、問題は、そのプロセスだけに閉じることができる(かもしれない)ということでしょう。
マルチプロセスの利点は、メモリ空間が分断されていることです。また、プロセスが分かれていることもメリットです。
メモリ空間が分断されているということは、競合を起こす相手がいないため、メモリへのアクセスに関しては、ロックなどの処理が不要ということです。
プロセスが分かれている利点は、1つのプロセスが仮に Segmentation Fault を起こすようなバグがあったときに、影響範囲がそのプロセスで済むかもしれない、ということです。マルチスレッドのプログラムで Segmentation Fault を引き起こすと、すべてのスレッドが道連れになります。マルチプロセスモデルでは、Segmentation Fault を引き起こしたプロセスだけが消滅し、ほかのプロセスは、そのままサービスを継続できます。
ここからは利点ではありませんが、マルチプロセスでデータを共有しようと思ったとき、共有メモリとロックを使用したり、プロセス間通信(Unixドメインソケット、ソケット、パイプ)を行うなど、そういったプログラミングが必要になります。
排他ロック
複数のスレッドで共有データにアクセスする場合は、「競合状態」(レースコンディション、クリティカルリージョン)に気をつけなければなりません。複数のスレッドで値を書換えるような場合、結果が変わってしまうことがあります。
クリティカルリージョンに入るときには、mutex(ミューテックス)を利用して排他ロックを行うことで、競合状態を避ける事ができます。
明示的にロックとアンロックをコーディングします。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void func (void) { // 前処理 pthread_mutex_lock(&mutex); // ここがクリティカルリージョン // 不可分な処理をここに書きます。 pthread_mutex_unlock(&mutex); // 後処理 }
ロックする範囲は、アトミックに処理したい範囲にするべきです。無意味にロック範囲を増やしてしまうと、ほかのスレッドの動作を妨げる時間が増え、スレッドを利用するメリットが減ってしまいます。
インストール
ベースシステムで用意されています。
ヘッダファイル
#include <pthread.h>
コンパイル
$ cc -lpthread main.c
もしくは pthread-config を使用して、Makefileに以下のように記述します。
CFLAGS=`pthread-config --cflags` LDFLAGS=`pthread-config --ldflags` LIBS=`pthread-config --libs`
マルチスレッドプログラミング
- pthreadとは
- pthread errnoとpthreadライブラリ関数の戻り値
- pthread 1つのスレッドを動かす
- pthread 2つのスレッドを動かす
- pthread mutexで排他ロックする方法
- pthreadのスレッド識別子pthread_t型
- pthread スレッドに値を渡す方法
- pthread スレッドから値を返す方法
関連項目
ツイート