ページ 11

マルチスレッドについて

Posted: 2013年5月18日(土) 21:16
by atori
今回初のマルチスレッドの挑戦しているのですが、なかなか苦戦しています。
C++の練習がてら、スレッド用のクラスを作っています。

コード:

#pragma once

#include <process.h>
#include <d3dx9.h>

[CThread.h]
class CThread
{
public:
	CThread(void);
	virtual ~CThread(void);

	unsigned int	Create( void* funcAdr );
	HRESULT			Close(void);

private:
	HANDLE	hThread;
};
[CThread.cpp]

コード:

#include "Thread.h"


CThread::CThread(void)
{
	hThread = NULL;
}


CThread::~CThread(void)
{
}

unsigned int	CThread::Create(void *func)
{
	unsigned int	threadId;
	hThread = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(__stdcall*)(void*))func, NULL, 0, &threadId);

	if(hThread == 0)
		return 0;

	return (unsigned int)hThread;
}

HRESULT	CThread::Close(void)
{
	BOOL	successClose;

	if(hThread != NULL)
	{
		WaitForSingleObject(hThread, INFINITE);
		successClose = CloseHandle(hThread);
	}
	else{
		return E_FAIL;
	}

	if(!successClose)
		return E_FAIL;

	return S_OK;

}
[main.cpp]

コード:

#include	<cstdio>
#include	"Thread.h"

unsigned int _stdcall	thread(void);

int main(void)
{
	CThread thread;
	HANDLE	hThread;

	hThread = (HANDLE)thread.Create(api);

	for(int i= 0; i<100; i++)
		printf("メイン\n");

	
	thread.Close();
}

unsigned int __stdcall	thread(void)
{
	int i=0;

	for(i=0; i<20; i++)
		printf("私がサブスレッドだ!!!!\n");

	return 0;
}
実行結果は、「メイン」をすべて出力仕切った後に「私がサブスレッドだ!!!!」と出ます。
試しにクラスを使わずにやってみると、バラバラに表示されました。

スレッドの動く順番というのは、一体何で決定されているのでしょうか?
また、クラスを使った方では、なぜスレッドが同時実行されていないような動きをしたのでしょうか?

Re: マルチスレッドについて

Posted: 2013年5月18日(土) 21:36
by h2so5
このコードでコンパイル通りますか?
apiというシンボルの定義がないように見えますが。

Re: マルチスレッドについて

Posted: 2013年5月18日(土) 21:45
by atori
あ、本当ですね・・・CThread::Create()に渡してる引数はthreadだと思ってください・・・
すいません

Re: マルチスレッドについて

Posted: 2013年5月18日(土) 21:50
by h2so5
クラスを使わない場合のコードも載せてもらえますか。

Re: マルチスレッドについて

Posted: 2013年5月18日(土) 22:00
by atori
こちらになります。

コード:

#include	<cstdio>
#include	<process.h>
#include	<d3dx9.h>

unsigned int _stdcall	thread(void*);

int main(void)
{
	unsigned int	threadId;
	HANDLE	hThread;

	hThread = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, &threadId);

	for(int i=0; i<100; i++)
		printf("メイン\n");

	WaitForSingleObject(hThread, INFINITE);

	CloseHandle(hThread);

	return 0;


}

unsigned int __stdcall	thread(void*)
{
	static int i=0;

	for(i=0; i<20; i++)
		printf("私がサブスレッドだ!!!!\n");

	return 0;
}
これを実行すると、両方バラバラに表示されたり、メインが表示し終わってからサブスレッドが表示されたり、
実行毎に結果が変わります。

Re: マルチスレッドについて

Posted: 2013年5月18日(土) 22:34
by h2so5
スレッドをどの順番でどう実行するかはOS任せなので、実行するたびに結果が変わるのは普通だと思います。
クラスを使った場合に同時実行されないように見えるのは偶然ではないでしょうか?

複数のスレッドからprintfした場合にバッファまわりがどうなるのかも気になりますが...

Re: マルチスレッドについて

Posted: 2013年5月18日(土) 22:53
by atori
マルチスレッドが出来ていないのではないのかという不安があったのでトピックを立てたのですが、
そういうわけではないのですね。安心しました。

h2so5さん、何度も返信してくださりありがとうございました。
このトピックは閉じさせて頂きます。

Re: マルチスレッドについて

Posted: 2013年5月18日(土) 23:04
by きゃりーわんわん
atori さんが書きました: マルチスレッドが出来ていないのではないのかという不安があったのでトピックを立てたのですが、
そういうわけではないのですね。安心しました。
既に解決済みですが。

マルチスレッドができていないわけではありません。
実際に以下でそれが確認できます。
①:クラスを使うコードのmain.cpp 12行目にSleep(100);を追加してどうなるか?
②:クラスを使うコードのmain.cpp 14行目のループ回数を500に変更してどうなるか?

結果として①②両方とも
subスレッドのprintf()とmainスレッドのprintf()が交互に出てきました。

このことからマルチスレッドで動作していることがわかります。