我试图通过将函数传递给_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;
}
答案 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每秒打印一次。
如果您的流程更大,您可以分配堆栈大小。