おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

はじめての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*型として渡す。