• win32多线程程序设计笔记(第五章)


    前面章节介绍了线程创建等过程,现在的问题是:如何在某个线程内终止另外一个正在运行的线程?


    windows核心编程中提到终止运行线程的方法

           1)线程函数自己返回

           2)线程通过调用ExitThread函数“杀死”自己,该函数将终止线程的运行并导致操作系统清理该线程使用的所有操作系统资源,但是使用的C/C++资源不会被销毁(慎用);

           3)调用TerminateThread函数,不同于ExitThread总是“杀死”主调线程,TreminateThread能杀死任何线程。但是TerminateThread函数时异步的,它告诉系统你想终止线程,但在函数返回时并不能保证线程已经终止了,线程无法正确清理(慎用)。


    本章中提到的做法是:使用一个手动重置的Event对象,线程检查该Event对象的状态或是等待它,举例说明。

     

    //线程退出事件
    HANDLE hExitEvent = null ;
    
    
    //一个需要长时间运行的线程
    DWORD WINAPI ThreadFun ( LPVOID p )
    {
        for ( int i =0 ; i < 1000000; i++ ){   //判断线程是否要被强制结束
            /* 可能在这里大家有点疑惑,如果没有调用 SetEvent()的方法,
               hExitEvent 不是总处于未激发状态吗?哪线程不就停在这里不动了?
               答案是:这里用到了 P74提到的一个Wait… ()一个用法,当time_out
               为,检查hExitEvent的状态,如果 hExitEvent处于未激发状态,
               立刻返回WAIT_TIMEOUT,如果 hExitEvent处于激发状态,则立刻
               返回WAIT_OBJECT_0。 */
    
    
            if ( WaitForSingleObject ( hExitEvent , 0 ) !=WAIT_TIMEOUT ){
                //做一些退出线程前的清理工作
                return (DWORD) -1 ;
                  }
        //做一些极其消耗时间的处理…
        //……
        //……
        }
    }
    
    
    void main()
    {
        HANDLE hThrd;
        //构造EVENT 核心对象,初始状态处于未激发状态, Manual方式
        hExitEvent = CreateEvent ( NULL,TRUE,FALSE,NULL ) ;
           
        //线程启动
        hThrd = CreateThread ( null,ThreadFun, …);
           
        Sleep(1000); //等待
            
        SetEvent ( hExitEvent ) ;//等待了很久,实在等不下去了,发出结束线程退出事件(激发 EVENT核心对象),迫使线程结束
        //等待线程结束
        WaitForSingleObject (hThrd, …);
        CloseHandle ( hThrd );
    }
    

    大致的一个过程就是下图所示:




             接下来就是线程优先权,调整线程优先权很简单,无非就是用SetThreadPriority()和GetThreadPriority()等函数。但如何有效,合理的调整线程的优先权却是一个复杂的问题,正如书上所说,“如果你的目标是保持简单,那就还是避免处理[优先权]这个烫山芋吧“。


  • 相关阅读:
    Android开发日志问题
    Android 常用的快捷键(随时更新)
    Android v4 包和v7包问题
    mongoDB 3.0.3 以上GUI 连接认证问题
    python(6)
    python学习(5)
    01_数字滤波器调研
    动态称重数据处理算法及其在禽蛋和类球形水果分选中的应用研究-01
    点云学习
    10-视频图像读取与保存
  • 原文地址:https://www.cnblogs.com/riskyer/p/3323045.html
Copyright © 2020-2023  润新知