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

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()等函数。但如何有效,合理的调整线程的优先权却是一个复杂的问题,正如书上所说,“如果你的目标是保持简单,那就还是避免处理[优先权]这个烫山芋吧“。

win32多线程程序设计笔记(第五章)的更多相关文章

  1. win32多线程程序设计笔记(第二章)

    第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点. 一.创建线程 与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用 ...

  2. win32多线程程序设计笔记(第四章下)

    上一笔记讲了同步机制中的临界区域(Critical Sections).互斥器(Mutexes),下面介绍同步机制中的另外两种. 信号量(Semaphores) 举个例子: 现在有人要租车,接待他的代 ...

  3. Javascript高级程序设计笔记 <第五章> 引用类型

    一.object类型 创建object实例的方式有两种: //第一种使用new操作符跟构造函数 var person= new Object(); person.name="小王" ...

  4. 深入浅出Win32多线程程序设计之基本概念

    一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...

  5. 由《win32多线程程序设计》临界区的问题所想

    之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLi ...

  6. Android群英传笔记——第五章:Android Scroll分析

    Android群英传笔记--第五章:Android Scroll分析 滑动事件算是Android比较常用的效果了,而且滑动事件他本身也是有许多的知识点,今天,我们就一起来耍耍Scroll吧 一.滑动效 ...

  7. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  9. 《Linux内核设计与实现》读书笔记——第五章

    <Linux内核设计与实现>读书笔记--第五章 标签(空格分隔): 20135321余佳源 第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限 ...

随机推荐

  1. Ntop监控网络流量

    运用Ntop监控网络流量 ____ 网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降. 网络性能降低.通过 ...

  2. javascript中处理引号编码&#034;

    1. <c:out value='${jxOrgJsonStr}' escapeXml="false"/> 2.或者使用innerText 直接接受${jxOrgJso ...

  3. 编译和安装shibboleth-sp遇到的问题

    In file included from mod_shib_20.cpp:68: mod_shib.cpp:118: warning: deprecated conversion from stri ...

  4. MemberShip使用大全

    比较全面的membership 使用过程 http://www.cnblogs.com/xlb2000/archive/2010/07/31/1788120.html Membership中创建的数据 ...

  5. Android中使用NDK

    首先用Android Studio下载NDK 这个比较简单,就不多说了 1.写调用jni的Java代码 新建一个JniUtils类 public class JniUtils { static { S ...

  6. 初始Android-配置环境

    最近闲来无事自学了一下Android,今天没事想整理一下思绪,简单的介绍一下我自己对环境配置的认识,仅供参考,欢迎提出意见. 1.首先打开Eclipse,然后安装ADT,准备好ADTjar包或者zip ...

  7. Xcode Could not load NIB 的一个问题解决

    # Could not load NIB 的一个问题 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pr ...

  8. FreeCodeCamp:Title Case a Sentence

    要求: 确保字符串的每个单词首字母都大写,其余部分小写. 像'the'和'of'这样的连接符同理. 结果: titleCase("I'm a little tea pot") 应该 ...

  9. C++之对象存储空间_对象模型

    C++编译器如何完成面向对象理论向计算机程序的转化 #include<stdio.h>//////c++对象模型和结构体一样         class Test            { ...

  10. NOIP2014解题报告

    day 1 1.生活大爆炸版石头剪刀布(rps) 直接按照题意模拟即可 #include<cstdio> #include<algorithm> #include<cst ...