Windows下的多线程

Windows下的多线程

一.线程函数

CreateThread

CreateThread 是一种微软在 Windows API 中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle 函数来关闭该线程对象。

cpp 复制代码
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)
  第一个参数 lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL 表示使用默认设置。
  第二个参数 dwStackSize 表示线程栈空间大小。传入 0 表示使用默认大小(1MB)。
  第三个参数 lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
  第四个参数 lpParameter 是传给线程函数的参数。
  第五个参数 dwCreationFlags 指定额外的标志来控制线程的创建,为 0 表示线程创建之后立即就可以进行调度,如果为 CREATE_SUSPENDED 则表示线程创建后暂停运行,这样它就无法调度,直到调用 ResumeThread()。
  第六个参数 lpThreadId 将返回线程的 ID 号,传入 NULL 表示不需要返回
该线程 ID 号
unsigned long _beginthreadex(
void *security, // 安全属性, 为 NULL 时表示默认安全性
unsigned stack_size, // 线程的堆栈大小, 一般默认为 0
unsigned(_stdcall *start_address)(void *), // 线程函数
void *argilist, // 线程函数的参数
unsigned initflag, // 新线程的初始状态,0 表示立即执行,//CREATE_SUSPENDED 表示创建之后挂起
unsigned *threaddr // 用来接收线程 ID
);

CloseHandle

函数来关闭该线程对象。

GetCurrentThreadId()

获取id

WaitForSingleObject

来等待一个内核对象变为已通知状态

WaitForSingleObject(
In HANDLE hHandle, //指明一个内核对象的句柄
In DWORD dwMilliseconds //等待时间

);

WaitForMultipleObjects

cpp 复制代码
WINBASEAPI
DWORD
WINAPI
WaitForMultipleObjects(
    _In_ DWORD nCount,//等待个数
    _In_reads_(nCount) CONST HANDLE* lpHandles,//等待数组
    _In_ BOOL bWaitAll,//是等待所有线程还说等待任意一个发出信号
    _In_ DWORD dwMilliseconds//等待时间
    );

二.句柄

调用创建内核对象的函数后,该函数会返回一个句柄,它标识了所创建的对象。它可以由进程的任何线程使用。

常见的内核对象 : 进程、线程、文件,存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象,邮件槽对象,信号对象

内核对象:为了管理线程/文件等资源而由操作系统创建的数据块。

三.线程对象

1.互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的互斥访问

权。

2.互斥对象包含一个使用数量,一个线程 ID 和一个计数器。其中线程 ID 用于

标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的

次数。

3.创建互斥对象:调用函数 CreateMutex。调用成功,该函数返回所创建的互斥

对象的句柄。

4.请求互斥对象所有权:调用函数 WaitForSingleObject 函数。线程必须主动请

求共享对象的所有权才能获得所有权。

5.释放指定互斥对象的所有权:调用 ReleaseMutex 函数。线程访问共享资源结

束后,线程要主动释放对互斥对象的所有权,使该对象处于已通知状态。

CreateMutex

cpp 复制代码
HANDLE
WINAPI
CreateMutexW(
    _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,//指向安全属性
    _In_ BOOL bInitialOwner,//初始化互斥对象的所有者 TRUE 立即拥有互斥体
    _In_opt_ LPCWSTR lpName//指向互斥对象名的指针 L"Bingo"
    );

加锁

cpp 复制代码
WaitForSingleObject(
    _In_ HANDLE hHandle,
    _In_ DWORD dwMilliseconds
    );

解锁

cpp 复制代码
WINBASEAPI
BOOL
WINAPI
ReleaseMutex(
    _In_ HANDLE hMutex
    );

四.线程同步之事件对象

1.创建事件对象

调用 CreateEvent 函数创建或打开一个命名的或匿名的事件对象。

cpp 复制代码
HANDLE
WINAPI
CreateEventW(
    _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,//安全属性
    _In_ BOOL bManualReset,//复位方式 true是手动复原 false是自动还原为无型号
    _In_ BOOL bInitialState,//初始状态 TRUE为有信号状态,FALSE为无型号状态
    _In_opt_ LPCWSTR lpName//对象名称 null为无名的事件对象
    );

2.设置事件对象状态

调用 SetEvent 函数把指定的事件对象设置为有信号状态。

3. 重置事件对象状态

调用 ResetEvent 函数把指定的事件对象设置为无信号状态。

4. 请求事件对象

线程通过调用 WaitForSingleObject 函数请求事件对象。

五.线程间通信之关键代码段

Windows内核对象,句柄,信号量和关键代码段

相关推荐
学不懂飞行器14 小时前
【2024电赛H题硬核解析】自动行驶小车满分对策:多路灰度循迹与陀螺仪“交替盲走”融合算法(附源码)
stm32·单片机·嵌入式硬件·算法·电赛
一路往蓝-Anbo15 小时前
第五章:如何对 HAL 库本身进行单元测试?
网络·数据结构·stm32·单片机·嵌入式硬件·单元测试·tdd
钿驰科技15 小时前
2026年无刷电机PCBA驱动板工厂推荐:产品选型+快速打样+项目陪跑
单片机·嵌入式硬件
CAE虚拟与现实17 小时前
img格式的文件在windows上怎么打开
windows·img文件·微软img
Deitymoon17 小时前
STM32——显示温湿度
stm32·单片机·嵌入式硬件
a588081117 小时前
星际争霸1原版安装包——游戏玩法、配置要求与详细安装教程
windows·游戏·游戏程序
IT搬砖客17 小时前
CC2340从机开发入门之OAD例程的选择
c语言·开发语言·单片机·嵌入式硬件
国产化创客18 小时前
ESP32+WebServer+LD2402实现人体/宠物感知
单片机·物联网·开源·智能硬件
A懿轩A18 小时前
Claude Code 2026 最新版下载安装教程详细版 涵盖Windows 和 MacOS 安装 附常见问题解决方案
windows·macos
坤坤藤椒牛肉面18 小时前
EXIT外部中断
单片机·嵌入式硬件