目录

不要让线程成为脱缰野马

1,干净地终止一个线程

“TerminateThread() 是一个危险的函数,应该在最不得已的情况下才使用”

2,线程优先权(Thread Priority)

3,初始化一个线程


不要让线程成为脱缰野马

这一章描述如何初始化一个新线程,如何停止一个执行中的线程,以及如 何了解并调整线程优先权。

1,干净地终止一个线程

1)利用 TerminateThread() 放弃一个线程

BOOL TerminateThread( HANDLE hThread,DWORD dwExitCode
);
----------------------------------------------------------------
参数
----------------------------------------------------------------
hThread             欲令其结束之线程的 handle 。该线程就是我们的行动目标。
----------------------------------------------------------------
dwExitCode          该线程的结束代码。
----------------------------------------------------------------
返回值
如果函数成功,则传回 TRUE。如果失败,则传回 FALSE。GetLastError()
可以获知更多细节。
----------------------------------------------------------------

“TerminateThread() 是一个危险的函数,应该在最不得已的情况下才使用”

这个函数不会在目 标线程中丢出一个异常情况(exception),目标线程在核心层面就被根本抹杀 了。目标线程没有机会捕捉所谓的“结束请求”,并从而获得清理自己的机会。

目标线程的堆栈没有被释放掉,于是可能 会引起一大块内存泄漏(memory leak)。而且,任何一个与此线程有附着关系 的 DLLs 也都没有机会获得“线程解除附着”的通知。

2)  跨越线程,丢出异常情况(Exceptions)

Win32 API 中没有 什么标准方法可以把一个异常情况丢到另一个线程中

3)设立一个标记

worker线程中有一个循环检查一个event。

2,线程优先权(Thread Priority)

1)优先权的计算基准:进程的“优先权类别(priority class)”、线程的“优先权层级 (priority level)”和操作系统当时采用的“动 态提升(Dynamic Boost )”所有因素放在一起,最后获得一 个 0~31 的数值。拥有最高优先权之线程,即为下一个将执行起来的线程

2)优先权类别(Priority Class)

“优先权类别”是进程的属性之一。

大部分程序使用 NORMAL_PRIORITY_CLASS。

3)优先权层级(Priority Level)

1>改变优先权层级

BOOL SetThreadPriority( HANDLE hThread,int nPriority
);
-------------------------------------------------------------
参数
-------------------------------------------------------------
hThread             代表欲调整优先权的那个线程。
-------------------------------------------------------------
nPriority           表格 5-2 所显示的数值。
-------------------------------------------------------------
返回值
如果函数成功,就传回表格 5-2 所列的其中一个值。如果函数失败,就传
回 FALSE 。GetLastError() 可以获得更详细的信息。
线程目前的优先权层级可以利用 GetThreadPriority () 获知。
-------------------------------------------------------------int GetThreadPriority( HANDLE hThread
);
-------------------------------------------------------------
参数
-------------------------------------------------------------
hThread 代表一个线程
-------------------------------------------------------------
返回值
如果函数成功,就传回 TRUE 。如果函数失败,就传回
THREAD_PRIORITY_ERROR_RETURN。GetLastError() 可以获得更详细的信息。
-------------------------------------------------------------

3)动态提升(Dynamic Boost)

所谓动态提升是对优先权的一种调整,使系统能够机动对待线程, 以强化程序的可用性。

1> 便是 Window s N T 施行于所有前台程序的“线程 动态提升”

2> 第二种优先权动态提升也适用于同属一个进程的线程,用以反应用户的输 入或磁盘的输入。例如,只要线程获得键盘输入,该线程就得到一个 +5 的优 先权调整值。

3> 那是在一个“等待状态”获得满足时发生的,例如有一个线程 正在等待一个 mu tex,当 Wait...() 返回时,该线程的优先权会获得动态提升。

4)更令人战栗的 Busy Waiting

改 变线程优先权可能会打开潘朵拉的盒子,一些新的问题跑出来,死锁的阴影也 潜在性地酝酿着。虽然优先权的基础知识很简单,但其实用面却可能很复杂。如果你的目标是保持简单,那就还是避免处理“优先权”这个烫手山芋吧。

3,初始化一个线程

1)如何初始化?

调用 CreateThread() ,新线程会如脱缰野马一下子就起跑了,你 根本来不及进行初始化设定操作。调用 CreateThread() ,新线程会如脱缰野马一下子就起跑了,你 根本来不及进行初始化设定操作。

hThread = CreateThread(NULL, 0, ThreadFunc, 0, CREATE_SUSPENDED, &threadId);
SetThreadPriority(hThread, THREAD_PRIORITY_IDLE);

一旦线程设定妥当,你可以调用 Resum eThread() 开始执行:

DWORD ResumeThread( HANDLE hThread
);
参数
hThread 欲被再次执行的线程。
返回值
如果函数成功,则传回线程的前一个挂起次数。如果失败,则传回
0xFFFFFFFF。GetLastError() 可以获得更详细的信息。

2)挂起(suspending)一个线程

这个函数允许调用端指定一个线程睡眠(挂起)。直到又有人调用 了 Resum eThread(),线程才会醒来。因此,睡眠中的线程不可能唤醒自己。

DWORD SuspendThread( HANDLE hThread
);
参数
hThread 欲被挂起的线程。
返回值
如果函数成功,则传回线程目前的挂起次数。如果失败,则传回
0xFFFFFFFF。GetLastError() 可以获得更详细的信息。

SuspendThread() 是另一个可能会潜在引发问题的函数。考虑一下这种情 况:一个进程拥有三个线程A,B,C。线程C正在某个 critical section 内, 而线程B正在等它出来。然后,线程A挂起了线程C。在这种情况下,线程C 将永远不会离开 critical section,而线程B也就相当于进入了死锁状态。

Win32多线程程序设计学习(第五章)相关推荐

  1. Intel汇编语言程序设计学习-第五章 过程-下

    5.3.3  库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...

  2. Intel汇编语言程序设计学习-第五章 过程-上

    过程 5.1  简介 需要阅读本章的理由可能很多: 1.读者可能想要学习如何在汇编语言中进行输入输出. 2.应该了解运行时栈(runtime stack),运行时栈是子过程(函数)调用以及从子过程返回 ...

  3. 深入浅出Win32多线程程序设计

    引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的成员员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操 ...

  4. c语言第五章作业,《C语言程序设计》第五章作业.doc

    <C语言程序设计>第五章作业 窗体顶端 <C语言程序设计>第5章作业 布置日期:2012-3-15?????截止日期:2012-3-22 一. 单选题 (每小题6分,共102分 ...

  5. 输出所有3位数的水仙花数,例:153=1的3次方+5的3次方+3的3次方 谭浩强《c语言程序设计》第五章第八题

    题目 本题是谭浩强<c语言程序设计>第五章第八题 题目:输出所有3位数的水仙花数,例:153=1的3次方+5的3次方+3的3次方 提示:以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨 ...

  6. 1个球从100m落下,每次时,反跳原高度的一半,再落,再反弹,求第10次落地共经过多少m,第10次反弹多高。 谭浩强《c语言程序设计》第五章第十一题

    题目 本题是谭浩强<c语言程序设计>第五章第十一题 题目:1个球从100m落下,每次时,反跳原高度的一半,再落,再反弹,求第10次落地共经过多少m,第10次反弹多高. 提示:以下是本篇文章 ...

  7. MATLAB学习第五章矩阵

    MATLAB学习第五章 5.1矩阵 矩阵元素修改 矩阵运算 5.1矩阵 eye(n):创建n×n的矩阵 eye(m,n):创建m×n的矩阵 eye(size(A)):创建与A维数相同的单位阵 ones ...

  8. 《win32多线程程序设计》学习笔记

    写于2016年6月24日 " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 "第一章 为什么千头万绪 {{{ ...

  9. c程序设计语言第五章,c程序设计语言第五章第7题答案

    7.\(\sum\limits_{k=1}^{100}k\) +\(\sum\limits_{k=1}^{50}{k}^2\) +\(\sum\limits_{k=1}^{10}{\frac{1}{k ...

最新文章

  1. 图像滤镜的一些加速和改进--笔记
  2. python开发需要掌握哪些知识-人工智能需要学习哪些专业课程知识?
  3. 开发指南专题十六:JEECG微云快速开发平台Excel导出
  4. python新手入门代码-python新手入门方法
  5. C#基础1:输入输出+变量定义
  6. llustrate dBpoweramp Asset UPnP Premium Mac 音频服务器
  7. corosync +drbd实现HA MariaDB
  8. Apache 模块 mod_cache应用
  9. nullnullvc中加花
  10. 微信小程序代码体积压缩到最小
  11. LeetCode 三等分(题解+优化过程)
  12. 三大主流前端框架介绍VUE 、React、Angular
  13. 土地资源管理就业怎么这么难_我所理解的土地资源管理专业
  14. C++ 一、C++简介
  15. 如何成为有效学习的高手(许岑)——思维导图 1
  16. 微信小程序:扫描身份证读取身份信息
  17. opencv机器视觉入门
  18. 基于H5+js开发一款音乐播放器
  19. 能否通过手机号查询他人位置及技术实现(省流:不能)
  20. python中dumps是什么意思_python中的dumps和loads区别

热门文章

  1. 华为matebook和linux版本区别,对比了解华为MateBook 14的优劣势
  2. 不需要专业的P图软件,你也能抠图!
  3. 摩申网络给你推荐5款好玩的手游
  4. 关于星空的java小程序_有关星空的小程序有哪些?有关星空的小程序分享!
  5. 文件夹Directory
  6. 会声会影如何新建html项目,如何使用即时项目模板-会声会影中文官网
  7. Java中Excel表格数据的导入和导出步骤和方法
  8. Android客户端的表情实现------来自王阳
  9. 角点检测(Harris Shi-Tomas)的原理及OpenCV API 的应用
  10. HyperWorks学习笔记(七)