マルチスレッドについて

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

マルチスレッドについて

#1

投稿記事 by atori » 11年前

今回初のマルチスレッドの挑戦しているのですが、なかなか苦戦しています。
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;
}
実行結果は、「メイン」をすべて出力仕切った後に「私がサブスレッドだ!!!!」と出ます。
試しにクラスを使わずにやってみると、バラバラに表示されました。

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

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

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

#2

投稿記事 by h2so5 » 11年前

このコードでコンパイル通りますか?
apiというシンボルの定義がないように見えますが。

atori
記事: 43
登録日時: 11年前

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

#3

投稿記事 by atori » 11年前

あ、本当ですね・・・CThread::Create()に渡してる引数はthreadだと思ってください・・・
すいません
Done is better than perfect.(Mark Elliot Zuckerberg)

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

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

#4

投稿記事 by h2so5 » 11年前

クラスを使わない場合のコードも載せてもらえますか。

atori
記事: 43
登録日時: 11年前

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

#5

投稿記事 by atori » 11年前

こちらになります。

コード:

#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;
}
これを実行すると、両方バラバラに表示されたり、メインが表示し終わってからサブスレッドが表示されたり、
実行毎に結果が変わります。
Done is better than perfect.(Mark Elliot Zuckerberg)

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

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

#6

投稿記事 by h2so5 » 11年前

スレッドをどの順番でどう実行するかはOS任せなので、実行するたびに結果が変わるのは普通だと思います。
クラスを使った場合に同時実行されないように見えるのは偶然ではないでしょうか?

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

atori
記事: 43
登録日時: 11年前

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

#7

投稿記事 by atori » 11年前

マルチスレッドが出来ていないのではないのかという不安があったのでトピックを立てたのですが、
そういうわけではないのですね。安心しました。

h2so5さん、何度も返信してくださりありがとうございました。
このトピックは閉じさせて頂きます。
Done is better than perfect.(Mark Elliot Zuckerberg)

きゃりーわんわん
記事: 34
登録日時: 11年前

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

#8

投稿記事 by きゃりーわんわん » 11年前

atori さんが書きました: マルチスレッドが出来ていないのではないのかという不安があったのでトピックを立てたのですが、
そういうわけではないのですね。安心しました。
既に解決済みですが。

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

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

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

閉鎖

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