ページ 11

並列処理プログラムについて

Posted: 2014年3月06日(木) 21:04
by kopi
現在、並列処理について学ぼうと思い、「マルチコアCPUのための並列プログラミング」という本を基に勉強しています。

そこで

コード:

#include<stdio.h>
#include<pthread.h>

#define THREAD_NUM 2
#define DATA_NUM 10

typedef struct _thread_arg{
	int thread_no;
	int *data;
}thread_arg_t;


void *thread_func(void *arg)
{
	thread_arg_t *targ = (thread_arg_t *)arg;		// 構造体型定義

	int i;

	for(i=0; i<DATA_NUM; i++){
		printf("thread%d : %d + 1 = %d\n", targ->thread_no, targ->data[i], targ->data[i]+1);
	}

	return NULL;
}


	
int main(void)
{
	pthread_t handle[THREAD_NUM];
	thread_arg_t targ[THREAD_NUM];

	int data[DATA_NUM];
	int i;

	//	初期化
	for(i=0;i<DATA_NUM;i++){
		data[i] = i;
	}

	//	スレッド生成
	for(i=0;i<THREAD_NUM;i++){
		targ[i].thread_no = i;
		targ[i].data = data;

		pthread_create(&handle[i], NULL, thread_func, (void *)&targ[i] );
	}

	for(i=0;i<THREAD_NUM;i++){
		pthread_join(handle[i], NULL);
	}

	
	return 0;
}

というコードがあり実行してみたところ以下のような結果が得られました。
キャプチャ.PNG
実行結果
キャプチャ.PNG (11 KiB) 閲覧数: 3123 回
このスレッドの切り替えというのはpthread_create関数にて行われているのでしょうか?

i=0 でスレッド0が実行され、i=1でスレッド1が実行されるのでは?と考えたのですが、これだと逐次処理になってしまいますし、
どこで疑似並列をしているのかなーと思った次第です。
まだ並列処理についてど素人ですので、かみ砕いてご教授いただければ幸いです。


環境
OS : Windows 7 64bit
コンパイラ : Visual Stdio 2005

Re: 並列処理プログラムについて

Posted: 2014年3月06日(木) 21:57
by h2so5
スレッドの切り替えはOSやライブラリ側が勝手にやってます。
pthread_createはスレッドを生成しているだけです。

Re: 並列処理プログラムについて

Posted: 2014年3月06日(木) 22:04
by softya(ソフト屋)
>どこで疑似並列をしているのかなーと思った次第です。

マルチコアなら真の並列動作です。

Re: 並列処理プログラムについて

Posted: 2014年3月07日(金) 00:20
by kopi
h2so5さん、softya(ソフト屋)さん回答していただきありがとうございます。
h2so5 さんが書きました:スレッドの切り替えはOSやライブラリ側が勝手にやってます。
pthread_createはスレッドを生成しているだけです。
この場合スレッド関数であるthread_funcはどの時点で実行されているのでしょうか。
関数を呼び出しているわけではなく、pthread_create関数の引数に thread_func関数へのポインタを渡しているわけですよね?

Re: 並列処理プログラムについて

Posted: 2014年3月07日(金) 00:24
by softya(ソフト屋)
pthread_create関数がOSにスレッドを生成を依頼して、OSが作り出すスレッドの実行先としてthread_func関数へのポインタが使われます。つまりOSから呼び出されます。
この質問を見ていると、そもそもプロセスとかスレッドが理解できていないのでは?と思いますが如何でしょう。

Re: 並列処理プログラムについて

Posted: 2014年3月12日(水) 20:39
by kopi
返信が遅くなってしまい申し訳ありません。
softya(ソフト屋) さんが書きました:pthread_create関数がOSにスレッドを生成を依頼して、OSが作り出すスレッドの実行先としてthread_func関数へのポインタが使われます。つまりOSから呼び出されます。
この質問を見ていると、そもそもプロセスとかスレッドが理解できていないのでは?と思いますが如何でしょう。
そうですね。まずはプログラムからではなく、プロセスやスレッドをきちんと理解した上でのプログラムですね。
次に質問する際は、そこをはっきりと理解した上で質問させていただきます。
ここで一度解決とさせていただきます。

回答したいただいた皆さんありがとうございました。