6

関数を _beginthread に渡して、メインから基本的なスレッドを作成しようとしています。しかし、私の出力は完了していません。

次の出力が得られます。

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;
}
4

3 に答える 3

10

メインから戻ると、アプリケーションのスレッドが停止するためです。スレッドが停止するまで待つ必要があります。グローバル変数を使用した最も単純なソリューション - 正直に言うと非常に悪い例です。スレッドのハンドルで待機関数を使用する必要があります。

#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 );
于 2012-10-25T06:36:51.763 に答える
2

いくつかの同期プリミティブを使用してスレッドが終了するのを待つ必要があります。そうしないと、スレッドが実行を終了する前にプログラムが 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;
}
于 2012-10-25T06:37:08.183 に答える