zoukankan      html  css  js  c++  java
  • 《Windows核心编程》读书笔记.Chapter06线程基础

    原文链接在印象笔记(效果也好的多):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或类似的函数,并向其传递线程的句柄
        • 为了良好的设计,不要使用。原因是被中止运行的线程收不到它被杀死的通知。线程无法正确清理,而且不能阻止自己被终止运行
        • 扩展名字解释:线程的堆栈
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    C++中的回调函数(callback)
    C++ Primer5 练习5.12:编程统计含有两个连续字符(ff、fl、fi)的字符序列的数量
    范围for循环过程中用&修改元素
    C++资料整理(持续更新)
    问题解决:VS报错:The build tools for v140 (Platform Toolset = 'v140') cannot be found
    上传新文件至个人hexo博客的步骤
    【Ubuntu】同时安装了python2和python3,使用pip安装软件时注意
    python解析xml文件 修改xml指定标签中的内容
    实操:main(int argc,char ** argv) 输出main函数的参数
    Saga-Python笔记
  • 原文地址:https://www.cnblogs.com/yutiansanshou/p/4034598.html
Copyright © 2011-2022 走看看