1 线程定义

<1> 内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方

<2>还有一个是线程堆栈。它用于维护线程在运行代码时须要的全部函数參数和局部变量.

2 线程和进程的差别

<1>进程是不活泼的。

进程从来不运行不论什么东西。它仅仅是线程的容器。

<2>线程在它的进程地址空间中运行代码,而且在进程的地址空间中对数据进行操作。

<3>线程共享进程的地址控件

<4>线程仅仅有一个内核对象和一个堆栈,保留的记录非常少,开销比进程少非常多。

3 线程函数

线程分为主线程以及一般线程。主线程的入口点函数必须是main。wmain,WinMain。wWinMain。一般线程函数则能够随便命名。而且必需要有一个函数返回值。

4 创建线程

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier);

<1>lpThreadAttributes

指向一个SECURITY_ATTRIBUTES的指针。指定安全属性,当为NULL的时候,会利用系统默认的安全属性

<2> dwStackSize

设置线程栈的初始大小,以字节为单位,系统会把它四舍五入到页面大小的近期值,当设置为NULL 的时候,会採取系统的默认值。

<3> lpParameter

指向应用程序定义的LPTHREAD_START_ROUTINE类型的函数的指针。这个函数将有新线程运行,表示线程的新的起始地址。指定一个函数做位新线程的入口地址,函数的名称随意,可是类型必须依照以下的格式:

DWROD   WINAPI    ThreadProc(LPVOID lpParameter);

<4> lpParameter

传递给线程的參数

<5> dwCreationFlags

设置用于线程创建的附加标记。是CREATE_SUSPENDED或者0两者之中的一个,假设是CREATE_SUSPENDED表示线程不马上运行。知道ResumeThread函数開始运行。

<6> lpThreadId

这是一个返回值,用于表示函数的线程ID。

系统给线程分配的堆栈是从进程的地址空间中分配的,全部线程共享进程地址空间。他们之间通信非常方便。

注意:CreateThread是Windows函数,假设要编写C/C++的多线程函数,那么就须要使用_beginTreadx函数

5 线程的终止执行

<1>线程函数的返回

<2>通过ExitThread函数撤销线程,只是最好不用

<3>同一个进程或者还有一个进程中的线程调用TerminateThread函数,应该避免用

<4>包括线程的进程的终止执行,应该避免用

5.1 线程函数返回时做的事情

<1>在线程函数中创建的全部C + +对象均将通过它们的撤消函数正确地撤消

<2>操作系统将正确地释放线程堆栈使用的内存

<3>系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值

<4>系统将递减线程内核对象的使用计数

5.2 ExitThread 函数

它可以使操作系统清除全部的操作系统资源,包含线程的堆栈,可是C++资源将不会被撤销

5.3 TerminateThread 函数

这个函数可以停止不论什么线程,可是它不会发送不论什么通知消息给将要撤销的线程。而且它是异步的。不能保证函数返回的时候,函数线程已经被终止。

在进程终止前,线程的堆栈是不会被清除的,这样方便其它线程使用。

5.4 进程终止时线程的终止

相同的问题是进程强制终止,会造成

5.5 线程终止时候发生的事情

<1>线程的退出代码从S T I L L _ A C T I V E改为传递给E x i t T h r e a d或Te r m i n a t e T h r e a d的代码

<2>线程内核对象的状态变为已通知

<3>假设线程是进程中最后一个活动线程。系统也将进程视为已经终止执行

<4>线程内核对象的使用计数递减1

注意:通过检查线程句柄的推出去代码能够检查线程是否已经终止。

响应的函数是:

BOOL GetExitCodeThread(HANDLE hThread,LPDWORD lpDword)

Windows内核之线程简单介绍的更多相关文章

  1. Windows内核之线程的调度,优先级,亲缘性

    1 调度 Windows不是实时操作系统,它是抢占式多线程操作系统.在如果全部优先级同样的情况下,CPU对线程的调度原则是每隔20m就会切换到下一个线程,依据Context中的IP和SP来接着运行上次 ...

  2. Linux线程简单介绍

    1.进程与线程 2.使用线程的理由 3.有关线程操作的函数 4.线程之间的互斥 5.线程之间的同步 6.试题最终代码 1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构 ...

  3. 【windwos 操作系统】关键的Windows内核数据结构一览(上)

    文章作者:r00tk1t 发布时间:2018年01月08日 - 21时56分 最后更新:2020年10月20日 - 21时01分 原始链接:https://r00tk1ts.github.io/201 ...

  4. Linux 内核开发—内核简单介绍

    内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态 ...

  5. [7] Windows内核情景分析---线程同步

    基于同步对象的等待.唤醒机制: 一个线程可以等待一个对象或多个对象而进入等待状态(也叫睡眠状态),另一个线程可以触发那个等待对象,唤醒在那个对象上等待的所有线程. 一个线程可以等待一个对象或多个对象, ...

  6. [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Control Region)

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 逆向分析操作系统内核代码至少需要具备两项技能: 段页汇编代码非常懂 ...

  7. 服务器端IO模型的简单介绍及实现 阻塞 / 非阻塞 VS 同步 / 异步 内核实现的拷贝效率

    小结: 1.在多线程的基础上,可以考虑使用"线程池"或"连接池","线程池"旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲 ...

  8. Windows内核基础知识-8-监听进程、线程和模块

    Windows内核基础知识-8-监听进程.线程和模块 Windows内核有一种强大的机制,可以在重大事件发送时得到通知,比如这里的进程.线程和模块加载通知. 本次采用链表+自动快速互斥体来实现内核的主 ...

  9. Redis的简单介绍及在Windows下环境搭建

    简单介绍 1,Redis是什么 最直接的还是看官方的定义吧. Redis is an open source (BSD licensed), in-memory data structure stor ...

随机推荐

  1. linux sun/awt/X11GraphicsEnvironment 找不到错误

    转载自:http://blog.csdn.net/bolg_hero/article/details/46594915 在Linux下,我们在用Java的图片包来处理图片时,经常遇到java.lang ...

  2. 使用echarts展示线状图信息的时候数据部分数据因为x轴的数据显示不全而隐藏的问题

    在使用echarts来展示数据时,因为数据很多的原因导致x轴显示不全,然后有些数据也隐藏在图表中,所以这个时候我们要在 series 中设置一个属性,让所有的数据都能够展示出来,这里我们需要添加的属性 ...

  3. could not find or load the Qt platform plugin "xcb"

    没有解决 一些资料: https://wiki.qt.io/Install_Qt_5_on_Ubuntu http://doc.qt.io/qt-5/linux-requirements.html h ...

  4. springboot 通用Mapper使用

    https://blog.csdn.net/dwf_android/article/details/79359360 https://www.cnblogs.com/larryzeal/p/58741 ...

  5. 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...

  6. 12、Flask实战第12天:子域名

    什么是子域名,我们的后台管理系统, 比如cms.heboan.com.配置子域名需要用到蓝图技术: 我现在buleprints下面创建一个cms.py 蓝图 from flask import Blu ...

  7. NOIP 2015 跳石头

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...

  8. 【后缀数组】【二分答案】【差分】poj1743 Musical Theme

    差分消除加减一个值得影响,貌似r二分上界要设成(n-2)/2?为啥? sa求不可重叠最长重复子串 给定一个字符串,求最长重复子串,这两个子串不能重叠.算法分析:这题比上一题稍复杂一点.先二分答案,把题 ...

  9. 【博弈论】【SG函数】hdu1848 Fibonacci again and again

    某个状态的SG函数被定义为 除该状态能一步转移到的状态的SG值以外的最小非负整数. 有如下性质:从SG值为x的状态出发,可以转移到SG值为0,1,...,x-1的状态. 不论SG值增加与否,我们都可以 ...

  10. 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq

    分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...