zoukankan      html  css  js  c++  java
  • Chapter07线程控制

    挂起和重启线程

           在线程内核对象中有一个标记线程挂起的计数器,当你调用CreateProcess或CreateThread函数时线程内核对象初始化为1,这样就可以在线程完成所有初始化工作之前阻止CPU调度它。

           当线程被完全初始化后,CreateProcess或CreateThread函数检查是否传递了CREATE_SUSPENDED标识。如果传递了则函数返回后,线程出于挂起状态;如果没有传递,则将线程挂起计数器置为0,使得线程处于可调度状态。

           创建一个挂起的线程可以让你在线程挂起期间做一些设置,修改线程环境(比如优先级等等)。在完成这些设置后,你最终还是得让线程处于可调度状态,这是就需要用到ResumeThread函数了。该函数如果成功,则返回前一个挂起计数器;如果失败则返回0xFFFFFFFF。

           一个线程可以被多次挂起,线程挂起函数SuspendThread函数。需要注意的是:如果一个线程调用被挂起三次,那么你也要调用ResumeThread函数将其解挂三次才行,两者必须一一对应。在实际编程过程,要慎重使用SuspendThread函数,因为你不一定明确该线程正在做什么工作,如果它正在申请堆栈,你这时将其挂起,就是个麻烦事。

    Sleep函数

           一个线程可以告诉系统:在一定时期内它不想被调度执行,这时就需要用到Sleep函数了,函数原型如下:VOID WINAPI Sleep( __in  DWORDdwMilliseconds );这个函数能将线程挂起直到dwMilliseconds时间耗尽,对于这个函数需要注意的是:

    1.       调用Sleep使线程自动发现余下的CPU时间片。

    2.       系统使得线程在指定的时间间隔内不能被调度。

    3.       你可以传递INFINITE作为参数,这样改线程将永远不会被调用;不过这样做似乎没什么意义,还不如直接退出线程,让系统好回收堆栈和内核对象。

    4.       你可以传递参数0,这样就相当于告诉系统该线程自动放弃余下的CPU时间片。

  • 相关阅读:
    2014复习提纲
    string库与char[]
    扩展欧几里得算法及其应用
    1002 [FJOI2007]轮状病毒
    node源码详解(三)—— js代码在node中的位置,process、require、module、exports的由来
    node源码详解(二 )—— 运行机制 、整体流程
    node源码详解 (一)
    html 第一天随记(个人不常用的标签)
    Siebel电信业务流程
    Siebel层次架构
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207202.html
Copyright © 2011-2022 走看看