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点のチェックにより上記のサンプルは実行できると思われる。
もしもっとエラーが出る場合は、追記するかもしれませぬ。