如何用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
相关产品推荐
相关产品推荐

