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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kopi
記事: 19
登録日時: 6年前

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

#1

投稿記事 by kopi » 6年前

現在、並列処理について学ぼうと思い、「マルチコア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) 閲覧数: 911 回
このスレッドの切り替えというのはpthread_create関数にて行われているのでしょうか?

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


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

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 6年前

スレッドの切り替えはOSやライブラリ側が勝手にやってます。
pthread_createはスレッドを生成しているだけです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 6年前

>どこで疑似並列をしているのかなーと思った次第です。

マルチコアなら真の並列動作です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kopi
記事: 19
登録日時: 6年前

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

#4

投稿記事 by kopi » 6年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 6年前

pthread_create関数がOSにスレッドを生成を依頼して、OSが作り出すスレッドの実行先としてthread_func関数へのポインタが使われます。つまりOSから呼び出されます。
この質問を見ていると、そもそもプロセスとかスレッドが理解できていないのでは?と思いますが如何でしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kopi
記事: 19
登録日時: 6年前

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

#6

投稿記事 by kopi » 6年前

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る