「pthread」の版間の差分
(→マルチスレッドプログラミング) |
|||
(同じ利用者による、間の3版が非表示) | |||
行10: | 行10: | ||
== 概要 == | == 概要 == | ||
+ | [[pthread]]は、[[C言語のマルチスレッドプログラミング]]を実現するライブラリです。 | ||
== スレッドとは == | == スレッドとは == | ||
スレッドは、「軽量プロセス」とも呼ばれます。 | スレッドは、「軽量プロセス」とも呼ばれます。 | ||
行74: | 行75: | ||
LIBS=`pthread-config --libs` | LIBS=`pthread-config --libs` | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | == -pthreadと-lpthreadの違い == | ||
+ | -pthreadと-lpthreadの違いですが、明確にはわかりませんでした。 | ||
+ | -lpthread は、リンカにリンクするライブラリを伝えるためのオプションです。 | ||
+ | -pthreadと-lpthreadでできるバイナリが微妙に違うのですが、明確な違いは不明です。 | ||
+ | |||
+ | * objdump の結果が同じ | ||
+ | * nm の結果が同じ | ||
+ | * ldd の結果が同じ | ||
== マルチスレッドプログラミング == | == マルチスレッドプログラミング == | ||
+ | * [[C言語のマルチスレッドプログラミング]] | ||
{{pthread}} | {{pthread}} | ||
+ | * [[pthread_mutex_lockとAtomic型修飾子の比較]] | ||
+ | |||
== 関連項目 == | == 関連項目 == | ||
+ | * [[メインページ]] | ||
<!-- vim: filetype=mediawiki | <!-- vim: filetype=mediawiki | ||
--> | --> |
2016年2月13日 (土) 22:33時点における最新版
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 の結果が同じ
マルチスレッドプログラミング
- C言語のマルチスレッドプログラミング
- pthreadとは
- pthread errnoとpthreadライブラリ関数の戻り値
- pthread 1つのスレッドを動かす
- pthread 2つのスレッドを動かす
- pthread mutexで排他ロックする方法
- pthreadのスレッド識別子pthread_t型
- pthread スレッドに値を渡す方法
- pthread スレッドから値を返す方法
- pthread_mutex_lockとAtomic型修飾子の比較