C言語のマルチスレッドについて

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

C言語のマルチスレッドについて

#1

投稿記事 by vchydds » 9年前

WaitForSingleObject()関数を使って、別のスレッドが終わるまでメイン関数の処理を止めたいのですが、止まらないときがあります。
なぜなのでしょうか? また、この問題を回避するにはどうすればいいのでしょうか?

コード:

#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<process.h>

void syori(void);

unsigned __stdcall another(){
	syori();
	printf("anotherスレッドの処理が終わりました\n");
	return 0;
}
void syori(){
	int a,b;
	unsigned long i;
	for(a=i=0;a<=35;a++)
		for(b=0;b<=0xfffffff;b++) i++;
	printf("%u\n",i);
}
int main()
{
	clock_t start,end;
	DWORD thread;
	HANDLE handle;
	
	//並列処理を使ったときの時間を計測
	start=clock();
	handle=(HANDLE)_beginthreadex(NULL,0,another,NULL,0,(unsigned int *)&thread);//別のスレッドを立てる
	syori();
	WaitForSingleObject((void *)thread, INFINITE);//ここで別のスレッドが終わるまで待ってくれるはず
	end=clock();
	printf("並列処理は%f秒\n\n",(double)(end-start)/CLOCKS_PER_SEC);//時間の表示
	
	//通常の処理のときの時間を計測
	start=clock();
	syori();
	syori();
	end=clock();
	printf("通常の処理は%f秒\n",(double)(end-start)/CLOCKS_PER_SEC);//時間の表示
	
	_endthreadex((unsigned)handle);
	CloseHandle(handle);
	return 0;
}

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

Re: C言語のマルチスレッドについて

#2

投稿記事 by h2so5 » 9年前

止まらないというのはどうやって判断しているのでしょうか。

vchydds
記事: 5
登録日時: 9年前

Re: C言語のマルチスレッドについて

#3

投稿記事 by vchydds » 9年前

h2so5 さんが書きました:止まらないというのはどうやって判断しているのでしょうか。
プログラムの実行結果を見て判断しています。
WaitForSingleObject()関数が、ちゃんと機能していれば

1073741824
anotherスレッドの処理が終わりました
1073741824
並列処理は4.711000秒

1073741824
1073741824
通常の処理は9.235000秒

または

1073741824
1073741824
anotherスレッドの処理が終わりました
並列処理は4.711000秒

1073741824
1073741824
通常の処理は9.235000秒

というような実行結果となるはずです。
しかし、ときどき

1073741824
並列処理は4.587000秒

1073741824
anotherスレッドの処理が終わりました
1073741824
1073741824
通常の処理は9.313000秒

このような実行結果が表示されることがあります。
おそらく、メイン関数の方がはやく処理が終わっているときにこのような実行結果が表示されるのだと思いますが、
対策方法が分かりません。どうすればいいのでしょうか?

sleep

Re: C言語のマルチスレッドについて

#4

投稿記事 by sleep » 9年前

WaitForSingleObjectに、handleではなく、threadIDを渡しているからではないですかね。

vchydds
記事: 5
登録日時: 9年前

Re: C言語のマルチスレッドについて

#5

投稿記事 by vchydds » 9年前

sleep さんが書きました:WaitForSingleObjectに、handleではなく、threadIDを渡しているからではないですかね。
ありがとうございます、解決しました。

閉鎖

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