zoukankan      html  css  js  c++  java
  • 多线程笔记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)//挂起一个 线程

  • 相关阅读:
    freeswitch录音功能
    jdk安装
    maven阿里云镜像
    idea安装
    idea新建maven项目
    tomcat安装
    idea新建maven web项目
    idea新建java项目
    webpack使用
    ACE 安装指南及示例
  • 原文地址:https://www.cnblogs.com/programmer-wfq/p/4644868.html
Copyright © 2011-2022 走看看