Windows核心编程 线程

news2024/12/26 0:30:10

目录

线程概述

进程与线程的关系

线程调度原理

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

多线程

线程相关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. 线程内核对象状态变为已通知。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flash Attention:高效注意力机制的突破与应用

注意力机制彻底改变了自然语言处理和深度学习领域。它们允许模型在执行机器翻译、语言生成等任务时专注于输入数据的相关部分。 在这篇博客[1]中,我们将深入研究被称为“Flash Attention”的注意力机制的突破性进展。我们将探讨它是什么、它是如何工作的&#xff0c…

赋值,浅拷贝,深拷贝

1.前置知识 数据分为基本类型(String, Number, Boolean, Null, Undefined,Symbol)和引用类型(Object)基本类型:直接存储在栈内存中的数据引用类型:指向改数据的指针变量存储在栈内存中,真实的数据存储在堆内存中引用类型在栈内存…

SpectralGPT: Spectral Foundation Model 论文翻译1

遥感领域的通用大模型 2023.11.13在CVPR发表 原文地址:[2311.07113] SpectralGPT: Spectral Foundation Model (arxiv.org) 摘要 ​ 基础模型最近引起了人们的极大关注,因为它有可能以一种自我监督的方式彻底改变视觉表征学习领域。虽然大多数基础模型…

河南省第一届职业技能大赛网络安全项目试题

河南省第一届职业技能大赛 网络安全项目试题 一、竞赛时间 总计:420分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 240分钟 200分 A-2 Web安全加固(Web) A-3 流量完整性保护与事件监控&a…

Openwrt 包管理系统介绍

Openwrt 包管理系统介绍 1. OpenWrt简介1.1 主要特点1.2 开源嵌入式操作系统1.2.1 嵌入式系统概念1.2.2 嵌入式系统分类1.2.3 嵌入式系统——安卓1.2.4 嵌入式系统的对比 2 OpenWrt包管理系统2.1 工作原理2.2 OPKG命令2.2.1 命令用法2.2.2 软件包的管理2.2.3 查询信息2.2.4 选项…

ubuntu 编译linux webrtc库

ubuntu 编译linux webrtc库 安装依赖 sudo apt-get update sudo apt-get install build-essential libssl-dev libasound2-dev libpulse-dev libjpeg-dev libxv-dev libgtk-3-dev libxtst-dev libwebp-dev sudo apt-get install libglib2.0-dev sudo apt-get update 报错时出…

设计测试用例的具体方法总结

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️白马沉河共歃誓,怒涛没城亦不悔 ☁️基于需求进行测试用例的设计 基…

【Linux】匿名管道与命名管道,进程池的简易实现

文章目录 前言一、匿名管道1.管道原理2.管道的四种情况3.管道的特点 二、命名管道1. 特点2.创建命名管道1.在命令行上2.在程序中 3.一个程序执行打开管道并不会真正打卡 三、进程池简易实现1.makefile2.Task.hpp3.ProcessPool.cpp 前言 一、匿名管道 #include <unistd.h&g…

死磕Nacos系列:Nacos在我的SpringCloud项目中做了什么?

Nacos服务注册 我们一个SpringCloud项目中集成了Nacos&#xff0c;当项目启动成功后&#xff0c;就可以在Nacos管理界面上看到我们项目的注册信息&#xff0c;还可以看到项目的健康状态等等信息&#xff1a; 那Nacos是什么时候进行了哪些操作的呢&#xff1f;今天我们来一探究…

数据挖掘 K近邻

什么时候用K近邻&#xff1f; 交叉验证的时候。最常见的交叉验证方法是K折交叉验证&#xff0c;其中数据集被均匀分成K个子集&#xff0c;称为折&#xff0c;然后执行K次训练和测试&#xff0c;每次选择不同的折作为测试集&#xff0c;其余的作为训练集。最后&#xff0c;将K次…

qt5.15.2及6.0以上版本安装

文章目录 下载在线安装器安装打开软件 下载在线安装器 因为从qt5.15开始不支持离线下载安装了&#xff0c;只能通过在线安装的方式进行安装。 下载在线安装下载器&#xff1a; 这个在线安装下载器网上也都是可以找到。 这里是其放到网盘上的下载地址&#xff1a; 链接&#x…

DBT踩坑第二弹

总结下dbt-spark踩到的坑&#xff0c;连接方式采用的是thrift连接 Kerberos认证。考虑到开源组件Kyuubi也是基于Hiveserver2&#xff0c;使用的thrift协议&#xff0c;所以采用Kyuubi执行SparkSQL。 官方文档给出的Thrift方式连接示例真的是简单&#xff0c;但是真是用起来真是…

01_MySQL介绍及安装

#任务背景 一、真实案例 某公司现在有几套不同版本的MySQL数据库&#xff0c;现在大部分的生产和测试环境都已经切换到5.7版本&#xff0c;由于历史原因&#xff0c;有一套测试环境版本为MySQL-5.5。现为了将测试环境版本统一&#xff0c;需要将原来测试环境数据库MySQL-5.5版…

Linux:创建进程 -- fork,到底是什么?

相信大家在初学进程时&#xff0c;对fork函数创建进程一定会有很多的困惑&#xff0c;比如&#xff1a; 1.fork做了什么事情?? 2.为什么fork函数会有两个返回值?3.为什么fork的两个返回值&#xff0c;会给父进程谅回子进程pid&#xff0c;给子进程返回0?4.fork之后:父子进…

哨兵1号回波数据(L0级)包格式解析与成像参数提取

坑爹的格式,具体有多坑往下看就知道了。matlab代码在文末。 先上首字母缩写: 再来回波数据包的格式图 1. 数据包格式 众所周知,解包的第一步是找帧头和帧长,找到第4~5字节,帧长码为“0x3761”,转十进制为14777,然而实际第一帧整帧的长度是14184。。。你要是加6我还能…

机器学习与因果推断的高级实践 | 数学建模

文章目录 因果推断因果推断的前世今生&#xff08;1&#xff09;潜在结果框架&#xff08;Potential Outcome Framework&#xff09;&#xff08;2&#xff09;结构因果模型&#xff08;Structual Causal Model&#xff0c;SCM&#xff09; 身处人工智能爆发式增长时代的机器学…

LeetCode OJ循环队列(C语言)

1.题目的初步分析 我们分析上述题目的时候会发现题目非常的长&#xff0c;不好整理思路&#xff0c;我这里可以大致的将本题的几个核心点说出来&#xff1a; 1.队列的思路 循环队列说来说去不还是队列嘛&#xff0c;那么队列的基本操作增删查改、以及队列的基本结构肯定都是不能…

京东家用电器商品电子说明书在哪里能找到怎么查看产品电子说明书?草柴返利APP如何查询领取京东优惠券拿京东购物返利?

京东商品电子说明书是一种便捷、高效的说明工具&#xff0c;为消费者了解和使用商品提供了重要帮助。京东商品电子说明书是一种以电子文档、图文、视频的形式提供的商品使用说明书。它通常由商家上传至京东平台&#xff0c;以供消费者在购买商品后下载查看。与传统的纸质说明书…

计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载

计算机编程零基础编程学什么语言&#xff0c;中文编程工具构件简介软件下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如…

Leetcode—94.二叉树的中序遍历【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—94.二叉树的中序遍历 C语言实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array mus…