原文链接在印象笔记(效果也好的多):https://app.yinxiang.com/l/AAQlNLnxTPRMAppVr5W0upchipQDDC_FHlU

  • 概要:
    • 现成也有两个组成部分:
      • 现成的内核对象,操作系统用它管理现成。系统还用内核对象来存放现成统计信息的地方
      • 线程栈,用于维护现成执行时所需的所有函数参数和局部变量
    • 进程从来不执行任何东西,它只是一个线程的容器
    • 现成必然是在某个进程的上下文中创建的,线程要在其进程的地址空间内执行代码和处理数据
    • 线程还共享内核对象句柄,句柄表是针对每一个进程的,而不是针对每一个线程
  • 6.1 何时创建线程
    • 线程描述了进程内部的一条执行线路。
    • 每次初始化进程时,系统都会创建一个主线程
    • 多线程简化了应用程序的用户界面的设计
  • 6.2 何时不应该创建线程
  • 6.3 编写第一个线程函数
  • 6.4 CreateThread函数(系统如何创建一个线程)
    • 调用CreateThread时,系统会创建一个线程内核对象。这个线程内核对象不是线程本身,而是一个较小的数据结构,操作系统利用这个结构来管理线程
    • 6.4.1 psa参数:是一个指向SECURITY_ATTRIBUTES结构的指针
    • 6.4.2 cbStackSize参数:指定线程可以为其线程栈使用多少地址空间。
      • 线程的动态增长:存储空间超过1个页面,导致线程溢出它的栈,会产生异常。系统捕获后的同时为空间区域调拨另一个页面,从而实现线程的动态增大。
      • 线程的存储空间:
      • 线程栈,线程栈预留地址空间
      • 预定空间的大小要么由/STACK连接器开关指定,要么由cbStack Size的值来指定,取其中较大的哪一个
      • 栈空间的上限:不仅可以放置应用程序耗尽物理内存区域,而且还可以尽早察觉程序中的bug
    • 6.4.3 pfnStartAddr和pvParam参数
      • pfnStartAddr参数指定希望新线程执行的县城函数的地址
      • pvParam参数与最初传给CreateTread的pvParam参数是一样的
      • Windows是一个枪战士的多线程系统,这意味着新的线程和调用CreateThread函数的线程可以同时执行,因为这两个线程是同时运行的
      • 当A线程已经closeHandle,B线程试图去更改现已无效的一个地址内容,这会导致线程B穿上你生访问违规,原因在于线程A的栈已在A终止运行时被销毁。
      • 使用静态变量也不能解决问题,会导致函数不可重用,因为两个线程将共享一个静态变量。
    • 6.4.4 dwCreateFlags:指定额外的标志来控制线程的创建
      • 值0:线程创建之后立即就可以进行调度
      • 值CREATE_SUSPENDED:系统将创建并初始化线程,但是会暂停该线程的运行,这样它就无法被调度
      • 备注:通过不同的方式来控制线程能否在创建之后马上被调度
    • 6.4.5 pdwThreadID:
      • 它必须是DWORD的一个有效地址
      • CreateThread函数用它来存储系统分配给新线程的ID(一般传NULL)
  • 6.5 终止运行线程
    • 四种终止线程运行的方法:
    • 6.5.1 线程函数返回:保证线程的所有资源都被正确清理的唯一方式
    • 6.5.2 ExitThread函数
      • 不推荐使用
      • 操作系统会清理该线程使用的所有操作系统资源
      • C/C++资源不会被销毁
    • 6.5.3 TerminateThread函数
      • 不同于ExitTread总是杀死主调线程,TerminateThread函数能杀死任何线程
      • 函数是异步的。它告诉系统你想终止线程,但在函数返回时,并不保证线程已经终止。如果需要确定线程已终止运行,还需要调用WaitForSingleObject或类似的函数,并向其传递线程的句柄
      • 为了良好的设计,不要使用。原因是被中止运行的线程收不到它被杀死的通知。线程无法正确清理,而且不能阻止自己被终止运行
      • 扩展名字解释:线程的堆栈
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

《Windows核心编程》读书笔记.Chapter06线程基础的更多相关文章

  1. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  2. Windows核心编程 第六章 线程基础知识 (上)

    第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...

  3. Windows核心编程读书笔记1

    今天特别困啊,这是为什么?!!刚刚把第一章看了一下,困到不行,所以写blog清醒一下. 第一章标题是“错误处理”,看了之后吓了一跳,难道第一章就讲这么高大上的东西?!不是不是,我现在的理解是,这章主要 ...

  4. Windows核心编程 第六章 线程基础知识 (下)

    6.6 线程的一些性质 到现在为止,讲述了如何实现线程函数和如何让系统创建线程以便执行该函数.本节将要介绍系统如何使这些操作获得成功. 图6 - 1显示了系统在创建线程和对线程进行初始化时必须做些什么 ...

  5. 《CLR via C#》读书笔记 之 线程基础

    第二十五章 线程基础 2014-06-28 25.1 Windows为什么要支持线程 25.2 线程开销 25.3 停止疯狂 25.6 CLR线程和Windows线程 25.7 使用专用线程执行异步的 ...

  6. windows核心编程---第六章 线程的调度

    每个线程都有一个CONTEXT结构,保存在线程内核对象中.大约每隔20ms windows就会查看所有当前存在的线程内核对象.并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入c ...

  7. CLR via C# 读书笔记-26.线程基础

    前言 这俩个月没怎么写文章做记录分享,一直在忙项目上线的事情,但是学习这件事情,停下来就感觉难受,clr线程这章也是反复看了好多遍,书读百遍其义自见,今天我们来聊下线程基础 1.进程是什么,以及线程起 ...

  8. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  9. windows核心编程---第五章 线程的基础

    与前面介绍的进程一样,线程也有两部分组成.一个是线程内核对象.它是一个数据结构,操作系统用它来管理线程以及用它来存储线程的一些统计信息.另一个是线程栈,用于维护线程执行时所需的所有函数参数和局部变量. ...

随机推荐

  1. explain mysql性能优化

    1 使用explain语句去查看分析结果,如   explain select * from test1 where id=1; 会出现: id  selecttype  table  type po ...

  2. 在ASP.Net和IIS中删除不必要的HTTP响应头[转]

    http://www.cnblogs.com/CareySon/archive/2009/12/14/1623624.html 引入 每次当浏览器向Web服务器发起一个请求的时,都会伴随着一些HTTP ...

  3. 树莓派/RaspberryPi Ubuntu远程连接

    网络设置 设置Ubuntu主机跟树莓派在同一网段,树莓派设置静态IP地址: 查看/etc/network/interfaces的内容,其中有#For static IP, consult /etc/d ...

  4. Web Socket rfc6455 握手 (C++)

    std::string data((const char*)buf->data(),bytes_transferred); recycle_buffer(buf); std::string ke ...

  5. 《LAMP系统工程师实用教程》读书笔记(一)- linux常用命令

    图书馆看到就借回来啦,这本书虽然其貌不扬,对新手还是挺棒的.来学下shell脚本和php. 把书上不熟悉的命令和选项记录下. mkdir -v创建文件夹并返回信息 mkdir -m创建文件夹并设定权限 ...

  6. 【已解决】vbox + ubuntu 设置 1366x768 分辨率

    1. 打开VBOX(Oracle VM VirtualBox),启动Ubuntu 2. 点击"设备>安装增强功能" 3. 进入Ubuntu打开文件管理器,如下图 4. 输入r ...

  7. 关于Context

    Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄.很多方法需要通过 C ...

  8. na+mb与gcd

    蒜头君和花椰妹在玩一个游戏,他们在地上将 nn 颗石子排成一排,编号为 11 到 nn.开始时,蒜头君随机取出了 22 颗石子扔掉,假设蒜头君取出的 22 颗石子的编号为 aa, bb.游戏规则如下, ...

  9. Shape Control for .NET

    Shape Control for .NET Yang Kok Wah, 23 Mar 2017 CPOL    4.83 (155 votes)   Rate this: vote 1vote 2v ...

  10. Roslyn介绍

    介绍 一般来说,编译器是一个黑箱,源代码从一端进入,然后箱子中发生一些奇妙的变化,最后从另一端出来目标文件或程序集.编译器施展它们的魔法,它们必须对所处理的代码进行深入的理解,不过相关知识不是每个人都 ...