はじめてのpthread(1)
pthreadを使って、並列処理を体感してみました。しかし、その実態は難解、OpenMPと比べて難しすぎる。そのせいか、参考となるドキュメントも少ない。pthreadとOpenMPの違いは難易度以外に、並列計算を実行するときの変数の扱いにあります、OpenMPはスレッドの生成と同時に変数をまるまるコピーします。そのため、一般的にpthreadに比べメモリを食う傾向にあるらしいです。(コンパイラが最適化しているかも...)。だから、pthreadを使って適切にコードをかければ、pthreadを使ったコードの方が速いはず!
#include <stdio.h> #include <pthread.h> #define THREAD_NUM 2 #define DATA_NUM 10 typedef struct _thread_arg{ int thread_no; int data[DATA_NUM]; }t_arg; void thread_func(void *arg){ t_arg *targ=(t_arg *) arg; int i; for(i=0;i<DATA_NUM;i++) printf("thread%d:data=%d\n",targ->thread_no,targ->data[i]); } ///////////////main////////////////// int main(void){ pthread_t handle[THREAD_NUM]; t_arg targ[THREAD_NUM]; int i,j; for(i=0;i<THREAD_NUM;i++){ targ[i].thread_no=i; for(j=0;j<DATA_NUM;j++) targ[i].data[j]=j; pthread_create(&handle[i],NULL,(void *)thread_func,(void *)&targ[i]); } for(i=0;i<THREAD_NUM;i++) pthread_join(handle[i],NULL); return 0; }
- pthread_createでスレッドを生成する。
- phread_joinでスレッドが完了するまで待つ。
- pthread_tでthread_idの配列を定義する。
- thread_funcは並列化したい関数を定義し。
- thread_funcの引数をtargで定義し、pthread_createにvoid*型として渡す。