使用线程的一个常见问题就是如何能够在一个线程开始运行之前,适当地将它初始化。初始化最常见的理由就是为了调整优先权。另一个理由是为了在SMP 系统中设定线程比较喜欢的 CPU。第10 章谈到 MFC 时我们会看到其他一些理由。
    基本问题在于,你需要一个线程 handle,才能够调整线程的性质。但如果你以默认型式调用 CreateThread(),新线程会如脱缰野马一下子就起跑了,你根本来不及进行初始化设定操作。
    解决之道就是 CreateThread() 的第5个参数,它允许你指定线程诞生时的属性。目前只定义有一种属性,就是 CREATE_SUSPENDED。这个属性告诉CreateThread() 说:产生一个新线程,传回其 handle,但不要马上开始执行之。
    下面是一个例子:
HANDLE hThread;
DWORD threadId;
hThread = CreateThread(NULL,
            0,
            ThreadFunc,
            0,
            CREATE_SUSPENDED,
            &threadId
        );
SetThreadPriority(hThread, THREAD_PRIORITY_IDLE);

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

挂起(suspending)一个线程
    相对于 ResumeThread(),毫不令人惊讶地,有一个 SuspendThread() 函数。这个函数允许调用端指定一个线程睡眠(挂起)。直到又有人调用了 ResumeThread(),线程才会醒来。因此,睡眠中的线程不可能唤醒自己。这个函数的规格如下:
DWORD SuspendThread(
        HANDLE hThread
    );
参数
    hThread     欲被挂起的线程。
返回值
    如果函数成功,则传回线程目前的挂起次数。如果失败,则传回0xFFFFFFFF。GetLastError() 可以获得更详细的信息。
    SuspendThread() 是另一个可能会潜在引发问题的函数。考虑一下这种情况:一个进程拥有三个线程A,B,C。线程C正在某个 critical section 内,而线程B正在等它出来。然后,线程A挂起了线程C。在这种情况下,线程C将永远不会离开 critical section,而线程B也就相当于进入了死锁状态。
    SuspendThread() 的最大用途就是用来协助撰写调试器。调试器允许在程序员的控制之下,启动或停止任何一个线程。

提要
    在这一章中你看到了“结束一个线程”的正确方法,你也看到了线程优先权的定义方式, 及其改变所带来的影响。最后你还看到了如何利用CREATE_SUSPENDED 来初始化一个线程—在它开始执行之前。

转载于:https://www.cnblogs.com/azbane/p/7566630.html

第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ----初始化一个线程...相关推荐

  1. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---简介

    这一章描述如何初始化一个新线程,如何停止一个执行中的线程,以及如何了解并调整线程优先权.     读过这一章之后,你将有能力回答一个 Win32 多线程程序设计的最基本问题.你一定曾经在 Usenet ...

  2. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---干净的终止一个线程...

    干净的终止一个线程  我曾经在第2章产生一个后台线程,用以输出一张屏幕外的 bitmap 图.我们必须解决的一个最复杂的问题就是,如果用户企图结束程序,而这张bitmap 图尚未完成,怎么办?第2章的 ...

  3. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---线程优先权(Thread priority)...

    有没有过这样的经验?你坐在你的车子里,目的地还在好几公里之遥,而时间已经很晚了.你拼命想告诉那些挡住你去路的人们,今天这个约会对你是多么多么重要,能不能请他们统统--呃--滚到马路外?很不幸,道路系统 ...

  4. c语言setevent线程互斥,是否每个调用SetEvent的autoreset事件都会唤醒一个线程?

    考虑以下方案: Event Signaled | Thread 1 | Thread 2 | Thread 3 -------------------------------------------- ...

  5. 【重难点】【JUC 05】线程池核心设计与实现、线程池使用了什么设计模式、要你设计的话,如何实现一个线程池

    [重难点][JUC 05]线程池核心设计与实现.线程池使用了什么设计模式.要你设计的话,如何实现一个线程池 文章目录 [重难点][JUC 05]线程池核心设计与实现.线程池使用了什么设计模式.要你设计 ...

  6. JAVA 编写程序实现如下功能:一个线程进行如下运算1*2+2*3+3*4+……+19*20,而另一个线程则每隔一段时间读取前一个线程的运算结果。

    编写程序实现如下功能:一个线程进行如下运算12+23+34+--+1920,而另一个线程则每隔一段时间读取前一个线程的运算结果. class Count{private int sum;Count(i ...

  7. 一个有趣的问题 : 如何设计一个线程池

    理解Java并发工具包线程池的设计 深度解读 java 线程池设计思想及源码实现 分布式锁unlock 问题产生原因分析: Step 1 :线程A先上同一个锁(Key)(20秒), 然后执行耗时业务, ...

  8. JAVA中初始化线程的两种方法_java中最简单的方式新起一个线程

    启动一个线程 在一个方法中启动一个线程,有两种方法 第一种是让类实现Runable接口,这样的话编译器就会提示你实现里面的未实现的方法(就是run方法) 第二种是,现在方法中new一个线程,然后直接调 ...

  9. java线程池是如何复用线程_线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)...

    任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...

最新文章

  1. 人工智能算法的可解释性方法研究
  2. 秒表c语言程序代码,求大神帮忙写一篇简单的C语言秒表程序, 谢谢。
  3. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
  4. 如何找到是哪一个进程占用了某个端口号
  5. python flask 大文件 下载_flask - python上传大文件到服务器报错
  6. Spring Cloud Alibaba基础教程版本升级:0.2.1-gt;0.2.2
  7. 单机装两个mysql_单机环境下安装多个MySQL服务器
  8. 电商促销类插画素材,适合各种活动banner设计
  9. 作为一个女程序员,有感而发
  10. Oracle的重做日志
  11. QT编译项目错误:转换到coff期间失败文件无效或损坏
  12. 如何获得微信小游戏跳一跳源码以及源代码组合包括哪些
  13. 大型网站技术架构演进与性能优化
  14. node 使用 cnpm
  15. 树莓派4+神经计算棒二代开发-环境搭建
  16. 【错误记录】编译 Linux 内核报错 ( Unable to find the ncurses package. )
  17. BLDC无刷直流电机
  18. debussy下载及安装
  19. Testin云测荣获5G应用企业服务优秀平台奖
  20. matlab /simulink车辆防抱死制动系统ABS建模仿真

热门文章

  1. Codex--GPT的写代码版本
  2. Tensorflow2.0实战练习之猫狗数据集(包含自定义训练和迁移学习)
  3. JQuery点击事件添加间隔
  4. Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题
  5. python入门指南许半仙在线阅读-《猛一相亲指南》TXT全本 百度云网盘下载 by许半仙...
  6. java 读写锁_Java中的读写锁
  7. Ubuntu20.04 安装tomcat
  8. Android开发知识(十一):让你的应用接入微信分享,完美绕过微信分享的大坑
  9. 华为南京研究所机考练习-亮着电灯的盏数
  10. 真我q5pro和OPPOK10哪个值得买 两者配置对比