「pthread」の版間の差分

提供: C言語入門
移動: 案内検索
(マルチスレッドプログラミング)
 
(同じ利用者による、間の4版が非表示)
行10: 行10:
  
 
== 概要 ==
 
== 概要 ==
 +
[[pthread]]は、[[C言語のマルチスレッドプログラミング]]を実現するライブラリです。
 
== スレッドとは ==
 
== スレッドとは ==
 
スレッドは、「軽量プロセス」とも呼ばれます。
 
スレッドは、「軽量プロセス」とも呼ばれます。
行32: 行33:
  
 
ここからは利点ではありませんが、マルチプロセスでデータを共有しようと思ったとき、共有メモリとロックを使用したり、プロセス間通信(Unixドメインソケット、ソケット、パイプ)を行うなど、そういったプログラミングが必要になります。
 
ここからは利点ではありませんが、マルチプロセスでデータを共有しようと思ったとき、共有メモリとロックを使用したり、プロセス間通信(Unixドメインソケット、ソケット、パイプ)を行うなど、そういったプログラミングが必要になります。
 +
 +
== 排他ロック ==
 +
複数のスレッドで共有データにアクセスする場合は、「競合状態」(レースコンディション、クリティカルリージョン)に気をつけなければなりません。複数のスレッドで値を書換えるような場合、結果が変わってしまうことがあります。
 +
 +
クリティカルリージョンに入るときには、mutex(ミューテックス)を利用して排他ロックを行うことで、競合状態を避ける事ができます。
 +
 +
明示的にロックとアンロックをコーディングします。
 +
<syntaxhighlight lang="c">
 +
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 +
 +
void
 +
func (void) {
 +
// 前処理
 +
 +
pthread_mutex_lock(&mutex);
 +
 +
// ここがクリティカルリージョン
 +
// 不可分な処理をここに書きます。
 +
 +
pthread_mutex_unlock(&mutex);
 +
 +
// 後処理
 +
}
 +
</syntaxhighlight>
 +
 +
ロックする範囲は、アトミックに処理したい範囲にするべきです。無意味にロック範囲を増やしてしまうと、ほかのスレッドの動作を妨げる時間が増え、スレッドを利用するメリットが減ってしまいます。
 
== インストール ==
 
== インストール ==
 
ベースシステムで用意されています。
 
ベースシステムで用意されています。
行48: 行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 の結果が同じ

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

関連項目