Visual Studio 2003 .NET でマルチスレッドのプログラムを作る

管理人の環境はVisual Studio 2008で、いろいろライブラリが入っていて、今回の記事のような心配はないようだ。
だが、知っておくとエラーを見たときにすぐに対処できるだろう。


まず、以下のようなマルチスレッドのプログラムを作成したとする。

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

unsigned __stdcall thread(void *);

int main()
{
	//Variable
	unsigned int thID;
	HANDLE hTh;
	//Start Thread
	hTh = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, &thID);
	//Main Sequence
	for (int i = 0; i < 20; i++) printf("Main[%d]\n", i);
	//Thread Terminate
	if (hTh != NULL) {
		CloseHandle(hTh);
		printf("Handle Closed\n");
	}
	//Quit
	return 0;
}

unsigned __stdcall thread(void *lpx)
{
	//Thread Sequence
	for (int i = 0; i < 4; i++) printf("Sub[%d]\n", i);
	//Quit
	return 0;
}


管理人のVisual Studio 2008では通常通りビルド出来る(開発用ランタイムがあるため?)。
そして、およそ結果は次のようになるだろう。

Main[0]
Main[1]
Main[2]
Main[3]
Sub[0]
Sub[1]
Main[4]
Main[5]
Sub[2]
Sub[3]
Main[6]
Main[7]
Main[8]
Main[9]
Main[10]
Main[11]
Main[12]
Main[13]
Main[14]
Main[15]
Main[16]
Main[17]
Main[18]
Main[19]
Handle Closed


しかし、中にはこんなエラーを見る人がいるかもしれない。

error C3861: '_beginthread': 識別子は、引数依存の照合を使用しても見つかりません。


この場合次の手順に従って状況を確認する。


まずは、インクルードファイルの確認だろう。
#include
#include
_beginthread、_beginthreadexの必須ヘッダはprocess.hである。
当然windows.hも使うと思われるので、この2つが順番通りインクルードされているか確認する。
何故かインクルードの順番を変えると大量のエラーが発生する(汗


次にプロジェクトの設定を確認する。
Win32コンソールアプリケーションで作成した場合、マルチスレッドデバッグDLL(/MDd)で作成されることだろう。
これは、ランタイムライブラリを動的にリンクする設定だ。
ランタイムライブラリがインストールされていない環境では実行できない。
しかしmsvcr90.dllなどは再配布が認められていない。
この場合解決方法はライブラリを静的リンクさせる方法になる。
簡単に言えば、構成プロパティ→C/C++→コード生成→ランタイムライブラリで、マルチスレッドデバッグDLL(/MDd)をマルチスレッド(/MT)に変える。


管理人の経験上、以上2点のチェックにより上記のサンプルは実行できると思われる。
もしもっとエラーが出る場合は、追記するかもしれませぬ。