HANDLE CreateSideThread()
{
DWORD dwGenericThread;
HANDLE hThread1 = CreateThread(NULL, 0, CallBackFunc, NULL, 0, &dwGenericThread);
return hThread1;
}
int main()
{
HANDLE Thread1;
Thread1 = CreateSideThread();
WaitForSingleObject(hThread1, INFINITE);
SomeOtherFunction();
return 0;
}
该程序会做其他事情,但你明白了。它基本上创建一个新线程并执行它在CallBackFunc中的任何内容(这是一个检查db状态的无限循环)。 现在,如果我删除WaitForSingleObject(),那么程序甚至不会尝试一次CallBackFunc并执行SomeOtherFunction()。 什么是线程的重点?我的意思是,我在这里很困惑。
我要做的是通过检查数据库状态来调用该线程,并在继续我的程序时调用其他函数来保持该线程。
我做错了什么? 请发布一个示例代码段。
由于
答案 0 :(得分:6)
如果没有WaitForSingleObject
,您对SomeOtherFunction()
的调用可能会很快返回,以便程序在新线程有机会运行一次之前退出。
当C程序从其main()
函数返回时,运行时系统会为您调用exit()
。即使其他线程试图同时运行,这也会强制退出程序。这与其他语言(例如Java)形成对比,其中退出主线程将不会退出进程,直到所有其他(非守护进程)线程也已完成运行。
答案 1 :(得分:1)
线程通常用于执行后台工作并释放调用线程以执行其他操作。
通常情况下,你描述的行为(调用SomeOtherFunction())正是你想要的:我将开始一个背景'工作'并开始我的生活。
看起来您的示例很好 - 但是如果您只是从main()返回,那么您的线程当然会终止(因为它由父进程拥有)。
也许更详细一些关于你为什么做的不是你期望发生的事情?
答案 2 :(得分:1)
您发现主线程在您注意到CallbackFunc被调用之前完成了。当你有Wait调用时,主线程被阻塞,直到新线程结束,所以你看到正在执行的线程函数。
线程并不像你想象的那么便宜,如果用一段需要足够长时间运行的东西替换SomeOtherFunction,你就会看到即使没有Wait调用也会调用你的线程函数。
答案 3 :(得分:0)
当然会调用CallBackFunc,但是当你的stared线程启动并运行时,无法保证。他们将一次工作,但在开始时这是不可预测的。这是系统调度程序的工作和属性。在你的情况下,当第二个函数被调用时,它们什么都没有。