创建新线程(C,Windows)

时间:2009-09-21 19:42:18

标签: c windows multithreading

好的,我在这里有点困惑。以下代码有效:

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()。 什么是线程的重点?我的意思是,我在这里很困惑。

我要做的是通过检查数据库状态来调用该线程,并在继续我的程序时调用其他函数来保持该线程。

我做错了什么? 请发布一个示例代码段。

由于

4 个答案:

答案 0 :(得分:6)

如果没有WaitForSingleObject,您对SomeOtherFunction()的调用可能会很快返回,以便程序在新线程有机会运行一次之前退出。

当C程序从其main()函数返回时,运行时系统会为您调用exit()。即使其他线程试图同时运行,这也会强制退出程序。这与其他语言(例如Java)形成对比,其中退出主线程将不会退出进程,直到所有其他(非守护进程)线程也已完成运行。

答案 1 :(得分:1)

线程通常用于执行后台工作并释放调用线程以执行其他操作。

通常情况下,你描述的行为(调用SomeOtherFunction())正是你想要的:我将开始一个背景'工作'并开始我的生活。

看起来您的示例很好 - 但是如果您只是从main()返回,那么您的线程当然会终止(因为它由父进程拥有)。

也许更详细一些关于你为什么做的不是你期望发生的事情?

答案 2 :(得分:1)

您发现主线程在您注意到CallbackFunc被调用之前完成了。当你有Wait调用时,主线程被阻塞,直到新线程结束,所以你看到正在执行的线程函数。

线程并不像你想象的那么便宜,如果用一段需要足够长时间运行的东西替换SomeOtherFunction,你就会看到即使没有Wait调用也会调用你的线程函数。

答案 3 :(得分:0)

当然会调用CallBackFunc,但是当你的stared线程启动并运行时,无法保证。他们一次工作,但在开始时这是不可预测的。这是系统调度程序的工作和属性。在你的情况下,当第二个函数被调用时,它们什么都没有。