• 多线程笔记4


    第五章:不要让线程成为脱缰野马

    1.干净的终止一个线程

     (1)BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)//dwExitCode:线程结束代码。

    线程在结束前没有机会清理自己,且堆栈不会释放,产生内存泄露。相关的DLLs没有机会获得”线程解除附着”的通知。这是一个危险的函数,非不得已的情况不用。

    (2)使用信号(Signals),行不通。

    (3)跨越线程,丢出异常。win32API中没有什么标准方法可以把一个异常情况丢到另一个线程中。

    (4)设立一个标记:使用一个手动重置(manual-reset)的 event 对象。Worker 线程可以检查该event 的状态或是等待它。

    2.线程优先权

    (1)以进程的“优先权类别(priority class)”、线程的“优先权层级 (priority level)”和操作系统当时采用的“动态提升(Dynamic Boost)”作为计算基准。拥有最高优先权之线程,即为下一个将执行起来的线程.如果优先权相同,则轮流调度。

    (2)4个优先权类别 ,两个相关函数:SetPriorityClass,GetPriorityClass

    HIGH_PRIORITY_CLASS 13

    IDLE_PRIORITY_CLASS 4

    NORMAL_PRIORITY_CLASS  7 or 8

    REALTIME_PRIORITY_CLASS 24

    (3)7个优先权层级

    THREAD_PRIORITY_HIGHEST +2

    THREAD_PRIORITY_ABOVE_NORMAL +1

    THREAD_PRIORITY_NORMAL 0

    THERAD_PRIORITY_BELOW_NORMAL -1

    THREAD_PRIORITY_LOWEST -2

    THREAD_PRIORITY_IDLE    set to 1

    THREAD_PRIORITY_TIME_CRITICAL  set to 15

    BOOL SetThreadPriority(HANDLE hThread, int nPriority);

    int GetThreadPriority(HANDLE hThread);

    (4)动态提升

    3.初始化一个线程

    (1)初始化理由:调整优先权;绑核等。

    (2)CreateThread()第五个参数设为CREATE_SUSPENDED

    (3)DWORD ResumeThread(HANDLE hThread)//执行一个线程

    (4)DWORD SuspendThread(HANDLE hThread)//挂起一个 线程

  • 相关阅读:
    Visual Studio技巧之打造拥有自己标识的代码模板
    arcgis 10.1 错误(TCP_NODELAY NOT enabled)
    中秋节快乐
    调Windows 7的图片浏览器查看图片
    NetCFSvcUtil.exe and Windows 7
    win7下IIS错误:"无法访问请求的页面,因为该页的相关配置数据无效"的解决方法(转)
    卫星地图下载软件WebImageDowns
    出差陕西镇安
    打印完税证明
    c#定义全局条件编译符号
  • 原文地址:https://www.cnblogs.com/programmer-wfq/p/4644868.html
Copyright © 2020-2023  润新知