创建新线程(C语言,Windows)

4

好的,我有点困惑。以下代码是有效的:

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个回答

6
没有WaitForSingleObject,你对SomeOtherFunction()的调用可能会非常快地返回,以至于新线程没有机会运行一次,程序就退出了。
当C程序从它的main()函数返回时,运行时系统会为你调用exit()。即使其他线程正在尝试运行,这也会强制退出你的程序。这与其他语言(如Java)不同,例如,在Java中,退出主线程不会退出进程,直到所有其他(非守护)线程也完成运行。

SomeOtherFunction()有一个无限循环,除非另一个线程写入文件,否则不会停止。 - wonderer
啊,你之前没有提到过这个。当你说“无限”的时候,SomeOtherFunction()是否会休眠?还是一个占用了100% CPU的硬循环?如果是后者,那么你的辅助线程可能没有足够的时间片来快速运行。 - Greg Hewgill
好的,我发现主线程在预期之前退出了。就这样。谢谢帮助。 - wonderer

1

线程通常用于执行后台工作,释放调用线程以做其他事情。

通常,您所描述的行为(调用SomeOtherFunction())正是您想要的:我将启动一个后台“作业”并继续我的生活。

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

也许您可以详细说明一下为什么您正在做的不是您期望发生的事情?


谢谢。我不会发布所有的代码,但是SomeOtherFunction()有一个无限循环,它会复制数据。它会一直执行此操作,直到另一个线程写入特定的文件为止。这会导致循环中断并退出。 - wonderer

1
你发现的是主线程在注意到CallbackFunc被调用之前就已经完成了。当你使用Wait调用时,主线程会被阻塞直到新线程完成,因此你会看到线程函数被执行。
线程并不像你想象的那么便宜,如果你用一些需要运行很长时间的东西来替换SomeOtherFunction,即使没有Wait调用,你也会看到线程函数被调用。

0
CallBackFunc当然会被调用,但是不能保证你的线程何时启动和运行。它们将会工作一次,但是什么时候开始工作是不可预测的。这是系统调度程序的工作和属性。在你的情况下,当第二个函数被调用时,它们就不会做任何事情了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接