You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CreateThread实现异步线程?解决主线程阻塞问题

让CreateThread创建的线程异步运行,主线程不阻塞

你的代码里导致主线程阻塞的核心是WaitForSingleObject(hThread, INFINITE)——这个函数会让主线程无限等待子线程执行完毕,才会继续往下走。要实现主线程和子线程并行执行,只需要调整等待的时机,或者在主线程完成自身任务后再等待子线程结束。

修改方案

1. 主线程先执行自身任务,最后等待子线程结束

把WaitForSingleObject移到主线程的任务代码之后,这样主线程会先完成自己的工作,再等待子线程收尾:

#include <Windows.h>
#include <stdio.h>
#include <unistd.h>

DWORD WINAPI DoStuff(LPVOID lpParameter)
{
    printf("Hello from thread\n");
    sleep(5);
    printf("Thread finished\n");
    return 0;
}

int main()
{
    HANDLE hThread = CreateThread(
        NULL,    // 线程属性(默认)
        0,       // 栈大小(0使用默认)
        DoStuff, // 线程入口函数
        NULL,    // 传递给线程的参数
        0,       // 创建标志(立即运行)
        NULL);   // 线程ID(无需获取则传NULL)
    if (hThread == NULL)
    {
        printf("线程创建失败,错误码:%d\n", GetLastError());
        return 1;
    }

    // 主线程执行自己的任务,这里用示例代码代替
    printf("Hello from parent\n");
    printf("主线程正在执行其他任务...\n");
    sleep(2); // 模拟主线程的任务耗时
    printf("主线程任务完成\n");

    // 现在等待子线程完成(如果不需要等待子线程,可跳过,但要注意进程退出会终止子线程)
    WaitForSingleObject(hThread, INFINITE);

    // 关闭线程句柄,释放资源
    CloseHandle(hThread);

    return 0;
}

2. 无需等待子线程完成(按需选择)

如果你的业务场景允许主线程先退出,不需要等待子线程执行完毕,可以直接移除WaitForSingleObject,但要注意:当主线程退出时,整个进程会终止,子线程会被强制结束。这种情况下,确保子线程的工作不需要完整执行,或者可以接受被中断:

#include <Windows.h>
#include <stdio.h>
#include <unistd.h>

DWORD WINAPI DoStuff(LPVOID lpParameter)
{
    printf("Hello from thread\n");
    sleep(5);
    printf("Thread finished\n");
    return 0;
}

int main()
{
    HANDLE hThread = CreateThread(
        NULL,    
        0,       
        DoStuff, 
        NULL,    
        0,       
        NULL);   
    if (hThread == NULL)
    {
        printf("线程创建失败,错误码:%d\n", GetLastError());
        return 1;
    }

    // 主线程执行自己的任务
    printf("Hello from parent\n");
    printf("主线程任务完成,即将退出\n");

    // 直接关闭线程句柄,主线程退出
    CloseHandle(hThread);

    return 0;
}

关键说明

  • WaitForSingleObject(hThread, INFINITE)的作用是阻塞当前线程(这里是主线程),直到目标线程结束。把它移到主线程任务之后,就能实现并行执行。
  • 线程句柄hThread必须调用CloseHandle关闭,避免资源泄漏,不管是否等待子线程结束都要做。
  • 如果需要主线程和子线程长期并行运行(比如服务程序),可以让主线程进入消息循环或者其他循环,无需显式等待子线程,只要确保进程不退出即可。

内容的提问来源于stack exchange,提问作者m3sfit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:15:08