関数を_beginthreadに渡して、mainから基本的なスレッドを作成しようとしています。しかし、私の出力は完了していません。
次の出力が得られます。
Starting thread
48
Main ends
I
誰かが次のコードの何が悪いのかを明確にしてくれませんか?
#include <iostream>
#include <process.h>
using namespace std;
void test(void *param)
{
cout << "In thread function" << endl;
Sleep(1000); // sleep for 1 second
cout << "Thread function ends" << endl;
_endthread();
}
int main()
{
cout << "Starting thread" << endl;
cout << _beginthread(test,0,NULL);
cout << "Main ends" << endl;
return 0;
}
メインから戻ると、アプリケーション内のすべてのスレッドが停止するためです。スレッドが停止するまで待つ必要があります。グローバル変数を使用した最も単純なソリューション-正直なところ、非常に悪い例です。スレッドのハンドルで待機関数を使用する必要があります。
#include <iostream>
#include <process.h>
using namespace std;
bool threadFinished = false;
void test(void *param)
{
cout << "In thread function" << endl;
Sleep(1000); // sleep for 1 second
cout << "Thread function ends" << endl;
threadFinished = true;
_endthread();
}
int main()
{
cout << "Starting thread" << endl;
cout << _beginthread(test,0,NULL);
while(!threadFinished)
{
Sleep(10);
}
cout << "Main ends" << endl;
return 0;
}
待機機能の使用方法:
HANDLE hThread;
hThread = (HANDLE)_beginthread( test, 0, NULL);
WaitForSingleObject( hThread, INFINITE );
いくつかの同期プリミティブを使用してスレッドが終了するのを待つ必要があります。そうしないと、スレッドが実行を終了する前にプログラムがExitProcessを呼び出します。
マルチスレッドアプリケーションの作成方法を理解するには、最初に 同期 について読むことができます。あなたの場合は 単一オブジェクト待機関数 が必要です。
Msdnの例を参照してください: http://msdn.Microsoft.com/en-us/library/kdzttdcb%28v=vs.71%29.aspx
したがって、メイン関数は次のようになります。
int main()
{
HANDLE hThread;
cout << "Starting thread" << endl;
cout << (hThread = (HANDLE)_beginthread(test,0,NULL));
WaitForSingleObject( hThread, INFINITE );
cout << "Main ends" << endl;
return 0;
}
CreateThread メソッドを使用できます。
マルチスレッドの簡単な例。
#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI thread1(__in LPVOID lpParameter) {
while (1) {
std::cout << " From Thread 1 \n";
Sleep(3000);
}
}
DWORD WINAPI thread2(__in LPVOID lpParameter) {
while (1) {
std::cout << " From thread 2\n";
Sleep(1000);
}
}
int main()
{
DWORD threadID1, threadID2;
HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, 0, 0,&threadID1);
HANDLE h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, 0, 0, &threadID2);
getchar();
return 0;
}
ここで、スレッド1は3秒ごとに印刷し、スレッド2は1秒ごとに印刷します。
プロセスが大きい場合は、スタックサイズを割り当てることができます。
StackSize 説明