Visual C ++ Threads简单示例

时间:2012-10-25 06:34:25

标签: c++ multithreading visual-c++ beginthread

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

3 个答案:

答案 0 :(得分:10)

因为从main返回会停止应用程序中的任何线程。你需要等待直到线程停止。全球变量最简单的解决方案 - 诚实的非常糟糕的例子。你需要在线程的句柄上使用wait函数。

#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 );

答案 1 :(得分:2)

您需要等待线程使用某些同步原语结束,否则您的程序将在线程完成执行之前调用ExitProcess。

您可以先阅读synchronization以了解如何编写多线程应用程序。在您的情况下,您需要single object wait functions

请参阅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;
}

答案 2 :(得分:1)

您可以使用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解释