6

我正在尝试通过将函数传递给 _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;
}
4

3 回答 3

10

因为从 main 返回将停止应用程序中的任何线程。您需要等到线程停止。具有全局变量的最简单解决方案 - 老实说,这是一个非常糟糕的例子。您需要在线程句柄上使用等待函数。

#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 回答
3

您可以使用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 秒打印一次,thread2 每秒打印一次。

如果您的进程更大,您可以分配堆栈大小。

StackSize解释

于 2016-05-04T06:44:49.140 回答
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 回答