c言語で、マルチスレッド を作成する方法について解説します。
マルチスレッドプログラミングの概要
c言語でマルチスレッドを実現するために、pthreadライブラリを使用します。
pthreadライブラリには、以下の機能を持つ関数が用意されています。
関数 | 機能 |
---|---|
pthread_create | スレッドの生成 |
pthread_exit | 現在のスレッドを終了する |
pthread_join | 他のスレッドが終了するのを待つ |
pthread_self | スレッドIDを得る |
pthread_detach | スレッドのリソースを開放 |
pthread_mutex_init | ミューテックスの初期化 |
pthread_mutex_lock | ミューテックスのロック |
pthread_mutex_unlock | ミューテックスのアンロック |
pthreadライブラリを使用する前の準備
pthreadライブラリ内の関数を使用する前に2点ほど準備することがあります。
1点目は、以下のようにpthreadライブラリをインクルードすることです。
#include <pthread.h>
2点目は、コンパイルする際にコマンドラインオプションに「-lpthread」をつけることです。
$ gcc threadCreate.c -lpthread
これでpthreadライブラリを使う準備ができました。
マルチスレッドプログラムの実装例
pthreadライブラリの準備ができたら、実際にマルチスレッドプログラムを実装します。
マルチスレッドプログラムを実現したソースコードは以下です。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define NUM_THREAD 3
void *threadFunc(void *arg);
int main(){
int ret = 0;
int i;
pthread_t thread[NUM_THREAD];
for(i = 0; i < NUM_THREAD; i++){
if(0 != pthread_create(&thread[i], NULL, threadFunc, (void *)i)){
printf("Failed to create thread thred num: %d", i);
}
}
sleep(1);
return 0;
}
void *threadFunc(void *arg){
int thread_num = (int)arg;
int i;
int sum = 0;
if( 2 == thread_num ){
pthread_exit(NULL);
}
for(i = 1; i <= 10; i++){
sum = sum + i;
}
printf("SUM: %d Thread: %d\n", sum, thread_num);
return NULL;
}
実行結果は以下です。
SUM: 55 Thread: 0
SUM: 55 Thread: 1
生成したスレッドの数だけ「threadFunc」が実行されました。
これで、マルチスレッドプログラムを実現できました。
スレッドの作成方法についてイメージわきましたか?
イメージがわいたところで、使用したpthreadライブラリの関数について具体的に紹介していきます。
スレッドの作成
スレッドは、「pthread_create」関数で作成することができます。
「pthread_create」関数は、以下のように定義されています。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
第1引数は、スレッドIDです。pthred_t型で定義した変数を格納します。
pthread_t thread[NUM_THREAD];
第2引数は、スレッドの属性です。基本的に「NULL」を格納すれば問題ありません。
第3引数は、スレッドで実行する関数を格納します。
第4引数は、第3引数で指定した関数の引数を格納します。
スレッドの終了
スレッドは、関数と同様に「return」がきたら終了します。
ですが、強制的に終了させたい場合は「pthread_exit」で終了可能です。
void pthread_exit(void *retval);
まとめ
c言語のマルチスレッドプログラムは、「pthread」ライブラリを使用することで、簡単に実現できます。
ぜひあなたもマルチスレッドを作成してみてください。
参考
おすすめ教材