pthread

提供: C言語入門
移動: 案内検索
スポンサーリンク

pthread とは、POSIXスレッドのことで、POSIX標準のスレッドです。pthreadは、Unix系(Linux,FreeBSD)などで使われます。C言語でスレッドプログラミングをするときに使用されるCライブラリです。スレッドを使用することで、プログラムを並列的に動かすことができます。プロセスを作成するforkとの違いは、スレッドは同じメモリ空間で動作するため、プロセスのリソースが共有されるということです。

読み方

pthread
ぴーすれっど
マルチスレッド
まるちすれっど
マルチスレッドプログラミング
まるちすれっど ぷろぐらみんぐ
Multi Thread
まるちすれっど
Multi Thread Proggraming
まるちすれっど ぷろぐらみんぐ

概要

pthreadは、C言語のマルチスレッドプログラミングを実現するライブラリです。

スレッドとは

スレッドは、「軽量プロセス」とも呼ばれます。 スレッドプログラムとマルチプロレスのプログラムの主な違いは、スレッドは、同じメモリ空間でリソースを共有することです。

マルチスレッドの利点

  • アプリケーションの応答性が改善できる
  • リステムリソースを節約できる
  • スレッド同士でデータを共有できる

シングルプロセスのプログラムでは、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と-lpthreadの違い

-pthreadと-lpthreadの違いですが、明確にはわかりませんでした。 -lpthread は、リンカにリンクするライブラリを伝えるためのオプションです。 -pthreadと-lpthreadでできるバイナリが微妙に違うのですが、明確な違いは不明です。

  • objdump の結果が同じ
  • nm の結果が同じ
  • ldd の結果が同じ

マルチスレッドプログラミング

関連項目




スポンサーリンク