Windows核心编程 线程

目录

线程概述

进程与线程的关系

线程调度原理

单核与多核的线程处理方式

多线程

线程相关API

线程分配

线程切换时

线程状态

线程退出

线程退出时做的事(正常退出情况)


线程概述

程序磁盘上的一个可执行文件(由指令和数据等组成的二进制文件)
进程程序执行代码所需的资源的集合,线程的容器,包括虚拟地址空间、代码、数据、对象句柄、环境变量等。特性:不活泼,懒惰的(不执行代码)
线程程序执行代码的最小单位。负责执行进程地址空间中的代码。特性:活泼,勤奋。
组成线程内核对象。操作系统用它来管理线程,存放线程统计信息。
线程堆栈。用于维护线程在执行时,需要的所有函数参数和局部变量。
时间片操作系统为每一个运行线程安排一定的CPU时间 。
PS:每个进程exe启动时系统会创建一个主线程。进程可以有多个线程。(个数最好为CPU核心数 * 2)

进程与线程的关系

  1. “不活泼”:进程不执行代码,是线程的容器。
    1. 若要使进程完成某项操作,则必须是它拥有的线程负责执行包含在进程地址空间中的代码。
  2. 数量关系:每个进程至少拥有一个线程。
    1. 进程建立时,操作系统会自动创建这个进程的第一个线程,称为主线程。此后,该线程可以创建其他的线程。
    2. 单个进程可能包含若干个线程,这些线程都共享进程的地址空间、对象句柄、代码和数据等其他资源。
  3. 生命周期:
    1. 进程中所有线程均退出时,进程退出,系统撤销进程拥有的地址空间和其他资源。

线程调度原理

  1. CPU某个时刻只执行一行代码,每个线程切片执行 。
  2. CPU的时间切片:CPU把执行代码的时间切分成不同的比较短的时间。
  3. 调度原理:每个线程分配一个时间切片,线程执行完后切换下一个时间片,直到全部线程执行完。
  4. 线程执行完当前时间切片后,要保存环境。下次继续执行的时候还原环境,不会从头执行。
  5. 所有线程都获得时间切片,线程开的越多,获得的CPU时间切片越多。
  6. 线程数量和效率有个临界点,线程开的越多,线程等待的时间也越长。
  7. CPU支持超线程,线程数最好不超过CPU核心数 * 2,不支持则线程数 = 核心数。
  8. 线程优先级不用设置,调用后效果不大。系统内部有一套算法,越繁重的任务优先级越高。

操作系统为每个线程保存各自的寄存器和栈环境,共享进程的地址空间、对象句柄、代码和数据等其他资源,可以执行相同的代码,可以对相同的和数据进行操作。

单核与多核的线程处理方式

对于单核处理器,不同的线程实际上是在轮流使用同一个处理器,一个程序的运行速度不会因为创建了多个线程而加快,因为线程多了以后,每个线程等待时间片的时间也就越长。

对于多核处理器,操作系统可以将不同的线程安排到不同的处理器内核中执行,系统可以同时执行与计算机上的CPU处理器内核一样多的线程,这样一个进程中的多个线程会因为同时获得多个时间片而加快整个进程的运行速度。

多线程

多线程API使用:Winodws核心编程 多线程-CSDN博客

线程相关API

CreateThread/_beginthreadex创建线程
ExitThread/_endthreadex退出线程
SuspendThread挂起线程
ResumeThread恢复线程
TerminateThread终止线程
GetCurrentThread 获取当前线程句柄(伪)
GetCurrentThreadId 获取当前线程ID
GetExitCodeThread 获取线程退出码

线程分配

线程通常分为两大类,他们负责不同的工作。
UI线程(主线程)负责消息处理等。规则:不应该处理1/10秒以上的工作
非UI线程(工作线程)负责干活不会引起消息阻塞的情况,就算有死循环,也是其他线程,和主线程没有关系

线程切换时

  1. 保存及恢复环境:
    1. –某线程时间片开始:系统将线程的寄存器值恢复并开始执行。
    2. –某线程时间片结束:系统将线程的寄存器值保存。
  2. 不同进程的线程切换:
    1. –操作系统同时切换物理内存到线性地址空间(虚拟内存)的映射关系,这样线程取的就是自己所属的进程中的代码和数据。

线程状态

线程的状态包括以下几种:

  1. 就绪状态(Ready):当线程被创建,且已经准备好执行时,处于就绪状态。线程在就绪状态时,等待系统调度器将其分配给一个可用的处理器。

  2. 运行状态(Running):当就绪状态的线程被系统调度器选择,并分配给一个处理器时,线程进入运行状态,开始执行线程的代码。

  3. 阻塞状态(Blocked):当线程被阻塞,无法继续执行时,进入阻塞状态。线程可能因为等待某个事件的发生(如I/O操作、锁资源的获取等)或者被其他高优先级任务抢占而进入阻塞状态。

  4. 挂起状态(Suspended):线程在运行状态或就绪状态时,可能被挂起(Suspend),即暂停执行。挂起状态的线程不会被调度执行。线程可以通过恢复(Resume)操作回到就绪或运行状态。

  5. 终止状态(Terminated):当线程的代码执行完成或者出现异常,线程进入终止状态。终止状态的线程不再被调度执行,线程的资源被释放。

线程退出

线程退出的办法:

  1. 线程函数的返回(推荐用法)
  2. ExitThread函数(不推荐)
    1. 促使系统清除该线程所使用的所有操作系统资源,但是 C++对象等资源将不被撤销(比如new变量)
  3. TerminateThread函数应该避免这种方法)。同一个进程或者另一个进程中的线程调用
    1. 是异步运行函数,它告诉系统希望线程终止,但不保证线程撤销的操作结果
    2. –拥有线程的进程终止运行之前,系统不撤销线程堆栈。
    3. –DLL接不到通知。
  4. 包含线程的进程终止应该避免使用这种方法)

自然死亡

DWORD WINAPI CountThreadProc(LPVOID lpParameter)
{
    HWND hDlg = (HWND)lpParameter;
    while (g_bRun)
    {

        //增加计数值
        ++g_nCount;
        //Sleep(1000);
        //显示到界面
        SetDlgItemInt(hDlg, EDT_SHOW, g_nCount, TRUE);

    }

    return 0;
}

ExitThread

TerminateThread

线程退出可以通过自然退出、调用ExitThread函数和调用TerminateThread函数来实现。下面是对比它们的说明:

  1. 自然退出(Natural Exit):线程在执行完自己的任务后,正常地从线程函数中返回,这是线程的一种正常退出方式。线程在自然退出时会依次执行一些清理工作(如释放资源、关闭文件等),并将返回值传递给创建线程的代码。

  2. 调用ExitThread函数:ExitThread函数是线程库提供的一个函数,用于显式地终止当前线程的执行。调用ExitThread函数会立即终止当前线程,并且不会执行线程的清理工作,包括不会触发析构函数的调用。此外,ExitThread函数会将指定的退出码传递给创建线程的代码。

  3. 调用TerminateThread函数:TerminateThread函数是操作系统提供的一个函数,用于强制终止指定线程的执行。调用TerminateThread函数会立即终止指定线程,但是它不会给线程执行清理工作的机会,包括不会触发析构函数的调用。此外,TerminateThread函数还可能会导致资源泄漏或其他不可预料的后果,因此在一般情况下,不建议使用TerminateThread函数。

线程退出时做的事(正常退出情况)

  1. 线程使用的堆栈等被释放。
  2. 系统将线程对象的退出代码设置为线程的退出码。
  3. 线程内核对象使用计数 -1.
  4. 线程内核对象状态变为已通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/187429.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解MySQL索引及事务

✏️✏️✏️今天给各位带来的是关于数据库索引以及事务方面的基础知识 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手&#…

redis持久化:RDB:和AOF

目录 RDB 持久化 1、修改配置文件:redis.conf 2、RDB模式自动触发保存快照 3、RDB模式手动触发保存快照 4、RDB的优缺点 AOF持久化 1、AOF持久化工作流程 2、修改配置文件开启AOF 3、AOF优缺点 4、AOF的重写机制原理 RDBAOF混合模式 redis持久化有两种方…

杰发科技AC7801——ADC软件触发的简单使用

前言 7801资料读起来不是很好理解,大概率是之前MTK的大佬写的。在此以简单的方式进行描述。我们做一个简单的规则组软件触发Demo。因为规则组通道只有一个数据寄存器,因此还需要用上DMA方式搬运数据到内存。 AC7801的ADC简介 7801的ADC是一种 12 位 逐…

机器学习-激活函数的直观理解

机器学习-激活函数的直观理解 在机器学习中,激活函数(Activation Function)是用于引入非线性特性的一种函数,它在神经网络的每个神经元上被应用。 如果不使用任何的激活函数,那么神经元的响应就是wxb,相当…

【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义

物理执行计划基本操作符 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏…

十大排序算法中的插入排序和希尔排序

文章目录 🐒个人主页🏅算法思维框架📖前言: 🎀插入排序 时间复杂度O(n^2)🎇1. 算法步骤思想🎇2.动画实现🎇 3.代码实现 🎀希尔排序 时间复杂度O(n*logn~n^2)希尔排序的设…

sql查询优化实际案例

1、第一步:sql优化 正对于海量数据的查询优化,且外键关联比较多的情况,通常情况是下sql层面的优化,有些时候是由于sql不合理的编写导致,如尽量少使用sql内查询等 如:避免使用 left join (select * form …

如何打造垂直LLM的护城河

B2B人工智能初创企业的一个伟大策略是打造“垂直人工智能”产品:成为特定行业的人工智能助手,比如律师、金融服务、医生。 听起来很简单:你可以利用LLM的超能力,并将其应用于宠物行业的特定数据和用例。 这就是我们在Explain所做的…

量子计算的发展

目录 一、量子力学的发展历程二、量子计算的发展历程三、量子计算机的发展历程四、量子信息科学的发展 一、量子力学的发展历程 量子力学是现代物理学的一个基本分支,它的发展始于20世纪初。以下是量子力学发展的几个重要阶段: 普朗克(1900&…

基于JavaWeb+SpringBoot+Vue医院管理系统小程序的设计和实现

基于JavaWebSpringBootVue医院管理系统小程序的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏[Java 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1微信小程序 2 2.2 …

「Java开发中文指南」IntelliJ IDEA插件安装(一)

IntelliJ IDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 插件扩展了Intel…

MYSQL基础知识之【创建,删除,选择数据库】

文章目录 前言MySQL 创建数据库使用 mysqladmin 创建数据库使用 PHP脚本 创建数据库 MySQL 删除数据库使用 mysqladmin 删除数据库使用PHP脚本删除数据库 MySQL 选择数据库从命令提示窗口中选择MySQL数据库使用PHP脚本选择MySQL数据库 后言 前言 hello world欢迎来到前端的新世…

网络层(IP协议)

文章目录 网络层IP协议IP协议报头32位源IP地址和目的IP地址:为了解决IP地址不够用的情况 IP地址管理子网掩码特殊IP 路由选择(简介) 网络层 网络层主要负责地址管理和路由选择.代表协议就是IP协议. IP协议 IP协议报头 4位版本: 4: 表示IPv4 ; 6: 表示IPv6 4位首部长度: 描述…

格式化输入输出

跟着肯哥(不是我)学格式化输入输出 C语言格式化输入 在C语言中,格式化输入(Formatted Input)是一种从标准输入读取数据并按照指定格式进行解析的操作,它主要通过使用标准库函数scanf()来实现格式化输入。 …

YOLOv8改进 | 2023 | FocusedLinearAttention实现有效涨点

论文地址:官方论文地址 代码地址:官方代码地址 一、本文介绍 本文给大家带来的改进机制是Focused Linear Attention(聚焦线性注意力)是一种用于视觉Transformer模型的注意力机制(但是其也可以用在我们的YOLO系列当中从而提高检测…

小程序项目:springboot+vue基本微信小程序的学生健康管理系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时…

基于协作搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于协作搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于协作搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于协作搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

“升级图片质量:批量提高或缩小像素,赋予图片全新生命力!“

如果你想让你的图片更加清晰、更加美观,或者符合特定的像素要求,那么现在有一个好消息要告诉你!我们推出了一款全新的图片处理工具,可以帮助你批量提高或缩小图片像素,让你的图片焕发出新的生机! 第一步&a…

基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码

基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工蜂鸟优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

我的崩溃。。想鼠??!

身为程序员哪一个瞬间让你最奔溃? 某天一个下午崩溃产生。。。 一个让我最奔溃的瞬间是关于一个看似无害的拼写错误。我当时正在为一个电子商务网站添加支付功能,使用了一个第三方支付库。所有的配置看起来都正确,代码也没有报错,…