繁体   English   中英

创建新线程(C,Windows)

[英]Creating a new thread (C, Windows)

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

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

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

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

谢谢

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

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

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

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

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

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

您发现的是主线程在您注意到CallbackFunc被调用之前完成。 当您进入Wait调用时,主线程将被阻塞,直到新线程完成,因此您将看到正在执行的线程函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM