「C言語のマルチスレッドプログラミング」の版間の差分
行7: | 行7: | ||
== 概要 == | == 概要 == | ||
+ | C言語のプログラムは、並列ライブラリか、fork などのプロセス生成の仕組みを使わない限り、プログラムは、1つの処理しか同時に実行できません。 | ||
+ | |||
+ | プログラムは、並列化を行うことで、処理を同時に行い、全体の処理時間を短くすることができます。プログラムのマルチスレッド化(並列化)は、スレッドライブラリを用いて実現します。 | ||
+ | == プログラムの並列化のメリット == | ||
+ | '''プログラム'''を並列化(マルチスレッド)にするメリットは、処理を同時にできるということです。 | ||
+ | |||
+ | 3つの WebAPI を呼び出すプログラムを書く場合に、1つ1つの WebAPI の呼び出しをシーケンシャル(順番に行う)行う場合と、同時に接続する場合を考えてみましょう。 | ||
+ | |||
+ | 直列に1つ1つ呼び出す場合には、1つの WebAPI が完了するまで、次の API を呼び出すことができません。1APIのリクエストが1秒かかる場合、同型で3秒かかります。 | ||
+ | |||
+ | 3つの WebAPI を同時に呼び出したらどうでしょうか? 1秒掛かる WebAPI を同時に 3つ呼び出した場合、合計時間は、1秒になります。 | ||
+ | |||
+ | 並列化すれば、処理に必要なメモリの量が増えたり、同時に通信すれば、通信の割込がその分増えたりといったことも発生します。一方で、全体の処理時間を減らせる場合もあります。 | ||
+ | == マルチプロセスとマルチスレッド == | ||
+ | マルチプロセスとマルチスレッドは、以下のように異なります。 | ||
+ | ;マルチプロセス(forkモデル):データを共有する必要がないか、少数のデータを共有する場合は、複数のプロセス(マルチプロセス)を起動し、プロセス間通信や共有メモリを用いて、データを共有するモデルです。 | ||
+ | ;マルチスレッド:メモリ空間を共有し、複数のスレッドでデータを共有するモデルです。 | ||
+ | |||
+ | マルチプロセスモデル(forkモデル)では、メモリ空間がプロセスごとに異なります。そのため、データの共有は、プロセス間通信を用いるか、共有メモリ(シェアードメモリ)を用いて、実現します。プロセス感通信には、名前付きパイプやUnixドメインソケット, ソケットなどを用いることができます。マルチプロセスモデルは、プロセスが独立しているため、プログラムがクラッシュしても、影響範囲をクラッシュしたプロセスに限定できるメリットがあります。 | ||
+ | |||
+ | マルチスレッドモデルは、1つのプロセス内に複数のスレッドを持ちます。スレッドは同じメモリ空間で実行されます。1つのプロセスであるため、プログラムがクラッシュした場合、影響は全体に波及します。 | ||
+ | == スレッドを実現する技術 == | ||
スレッドプログラミングを実現するには、スレッドライブラリを利用するか、並列化のためのキーワードを用います。 | スレッドプログラミングを実現するには、スレッドライブラリを利用するか、並列化のためのキーワードを用います。 | ||
+ | |||
+ | 以下は、スレッドライブラリです。 | ||
* [[pthread]] | * [[pthread]] | ||
+ | |||
+ | 以下は、プロプロセッサディレクティブで並列化を簡単に実現できます。 | ||
* [[OpenMP]] | * [[OpenMP]] | ||
* [[Cilk Plus]] | * [[Cilk Plus]] |
2016年1月20日 (水) 01:37時点における版
C言語では、スレッドライブラリを用いて、プログラムをマルチスレッド化し、処理を並列化できます。
読み方
- マルチスレッドプログラミング
- まるちすれっど ぷろぐらみんぐ
- multi thread programming
- まるちすれっど ぷろぐらみんぐ
概要
C言語のプログラムは、並列ライブラリか、fork などのプロセス生成の仕組みを使わない限り、プログラムは、1つの処理しか同時に実行できません。
プログラムは、並列化を行うことで、処理を同時に行い、全体の処理時間を短くすることができます。プログラムのマルチスレッド化(並列化)は、スレッドライブラリを用いて実現します。
プログラムの並列化のメリット
プログラムを並列化(マルチスレッド)にするメリットは、処理を同時にできるということです。
3つの WebAPI を呼び出すプログラムを書く場合に、1つ1つの WebAPI の呼び出しをシーケンシャル(順番に行う)行う場合と、同時に接続する場合を考えてみましょう。
直列に1つ1つ呼び出す場合には、1つの WebAPI が完了するまで、次の API を呼び出すことができません。1APIのリクエストが1秒かかる場合、同型で3秒かかります。
3つの WebAPI を同時に呼び出したらどうでしょうか? 1秒掛かる WebAPI を同時に 3つ呼び出した場合、合計時間は、1秒になります。
並列化すれば、処理に必要なメモリの量が増えたり、同時に通信すれば、通信の割込がその分増えたりといったことも発生します。一方で、全体の処理時間を減らせる場合もあります。
マルチプロセスとマルチスレッド
マルチプロセスとマルチスレッドは、以下のように異なります。
- マルチプロセス(forkモデル)
- データを共有する必要がないか、少数のデータを共有する場合は、複数のプロセス(マルチプロセス)を起動し、プロセス間通信や共有メモリを用いて、データを共有するモデルです。
- マルチスレッド
- メモリ空間を共有し、複数のスレッドでデータを共有するモデルです。
マルチプロセスモデル(forkモデル)では、メモリ空間がプロセスごとに異なります。そのため、データの共有は、プロセス間通信を用いるか、共有メモリ(シェアードメモリ)を用いて、実現します。プロセス感通信には、名前付きパイプやUnixドメインソケット, ソケットなどを用いることができます。マルチプロセスモデルは、プロセスが独立しているため、プログラムがクラッシュしても、影響範囲をクラッシュしたプロセスに限定できるメリットがあります。
マルチスレッドモデルは、1つのプロセス内に複数のスレッドを持ちます。スレッドは同じメモリ空間で実行されます。1つのプロセスであるため、プログラムがクラッシュした場合、影響は全体に波及します。
スレッドを実現する技術
スレッドプログラミングを実現するには、スレッドライブラリを利用するか、並列化のためのキーワードを用います。
以下は、スレッドライブラリです。
以下は、プロプロセッサディレクティブで並列化を簡単に実現できます。