创建线程CreateThread
修改说明:
CreateThread()
来创建线程其实是一种不太好的方法,在实际使用中尽量使用_beginthreade()来创建线程,因为更加的安全
函数的原型:
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
参数说明:
第一个参数 lpThreadAttributes
表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数 dwStackSize
表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个参数 lpStartAddress
表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个参数 lpParameter
是传给线程函数的参数。
第五个参数 dwCreationFlags
指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个参数 lpThreadId
将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
返回值
CreateThread
的返回值是线程的句柄,失败的话就返回NULL
实例1:
/* 创建第一个线程。主进程结束,则撤销线程。 */
#include<Windows.h>
#include<stdio.h>
DWORD WINAPI ThreadFunc(LPVOID);
void main()
{
HANDLE hThread;
DWORD threadId;
hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &threadId); // 创建线程
printf("我是主线程, pid = %d\n", GetCurrentThreadId()); //输出主线程pid
Sleep(2000);
}
DWORD WINAPI ThreadFunc(LPVOID p)
{
printf("我是子线程, pid = %d\n", GetCurrentThreadId()); //输出子线程pid
return 0;
}
实例2:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <process.h>
//typedef unsigned long DWORD;
//#define WINAPI __stdcall 标准的呼叫;
//typedef void far *LPVOID;
DWORD WINAPI mymsg(LPVOID lp)
{
MessageBoxA(0,"Hello China","Welcome!",0);
return 0;
}
int main(void)
{
//顺序执行
//MessageBoxA(0,"Hello China","Welcome!",0);
//MessageBoxA(0,"Hello China","Welcome!",0);
//MessageBoxA(0,"Hello China","Welcome!",0);
//MessageBoxA(0,"Hello China","Welcome!",0);
//_beginthread(); //以前依赖的是_beginthread进行多线程执行;
int i;
HANDLE hthread;
DWORD threadid;//保存进程的编号;
for (i = 0; i <5; i++)
{
hthread = CreateThread(
NULL,//表示线程内核对象的安全属性;
NULL,//表示线程堆栈空间的大小;
mymsg,//表示新线程所执行的线程函数地址;
NULL,//函数的参数;
0,//立刻执行;
&threadid//将返回线程的ID号;
);
//单线程的等待;
//INFINITE //超时等待,等待上一步执行完毕才继续执行;
//IGNORE //忽略等待,直接启用线程;
WaitForSingleObject(hthread,INFINITE);
CloseHandle(hthread);//关闭一个线程;
}
//mymsg(NULL);
//CreateThread()
system("pause");
return 0;
}
```
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异