当我开始在 Win32 上使用线程时,这个问题就一直在折磨我。我花了数天甚至数周的时间来寻找答案,并且希望找到的是一个好答案。
这个问题是:

我如何在某个线程内终止另一个正在运行的线程?

TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。这带来的副作用便是,线程没有机会在结束前清理自己。

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

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

这个函数所带来的隐伏危机还包括: 如果线程正进入一个 critical section之中,该critical section 将因此永远处于锁定状态。

我的结论是:离 Term inateThread() 远远地!

正确的方法:

设立一个标记
当所有方法都失败时,不妨返朴归真,回到最简单最明白的路上。 Win32 核准的做法是在你的程序代码中设立一个标记,利用其值来要求线程结束自己。

在京麦代码中,使用的是一个bool变量。在子线程的run()函数中,在几个需要长时间操作之前,先检查下该bool变量的值。

如果该bool值为false了,那么子线程直接就退出。

主线程通过子线程的setValue()方法,改变该bool值。

当然setValue()方法和run()方法中,对该bool值的访问都必须要加锁。

因为主线程中,会调用setValue()方法改变该bool值。

主线程 如何控制 子线程相关推荐

  1. Java多线程之----主线程会等待子线程结束再结束么,怎么让主线程等待子线程结束呐?

    首先给出结论: 主线程和子线程之间没有谁先谁后结束这种关联,它们只是各自负责自己的线程任务,如果该线程的任务结束了,该线程自然会结束运行. talk is cheap,show me the code ...

  2. Java中主线程如何捕获子线程抛出的异常

    Java中主线程如何捕获子线程抛出的异常 参考文章: (1)Java中主线程如何捕获子线程抛出的异常 (2)https://www.cnblogs.com/jpfss/p/10272885.html ...

  3. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  4. 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

    文章目录 一.判定当前线程是否是主线程 二.子线程中执行主线程方法 三.主线程中执行子线程方法 一.判定当前线程是否是主线程 在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如 ...

  5. DLL内线程同步主线程研究(子线程代码放到主线程执行)

    DLL内线程同步主线程研究(子线程代码放到主线程执行) 我们在实际项目中经常会用到多线程编程,比如Socket编程等,在创建的线程内同步主线程一般使用Synchronize方法实现子线程操作放到主线程 ...

  6. java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...

    最近看golang main函数结束,所有协程都被结束了 结论是这样:A不是main程的情况下,在A程里开启B程,A程执行完,A程return之后,B程不受影响,不会挂掉.所有子协程与main程同级的 ...

  7. 主线程和子线程的关系(讨论主线程结束,子线程是否要回收)

    主线程和子线程,在操作系统里面其实是一样的,没有本质区别.至于主线程结束,子线程是否要回收,下面有两种比较特殊的情况. 第一种: 主线程退出了,子线程还可以执行. 主要是因为pthread_exit函 ...

  8. [转]Java中主线程如何捕获子线程抛出的异常

    这么来看待这个问题.首先明确线程代码的边界.其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界.Runnable接口中run方法原型如下:     <<   ...

  9. 在主线程中为子线程解锁_在XP中为Google Chrome启用Vista黑色风格主题

    在主线程中为子线程解锁 If you've seen the screenshots of Google Chrome on XP vs Vista, you've probably noticed ...

最新文章

  1. python-print
  2. 简单问题:sizeof(char型数组)为数组大小,而不是4, 为什么? 100!
  3. AtCoder Regular Contest 100 E - Or Plus Max Sos dp
  4. 修改数据库端口为51433
  5. numpy中数组的简单运算以及使用
  6. 全网首次公开!iOS14 到来前,开发者必需的时间表及 To do list
  7. 埃斯顿服务器上电无显示,埃斯顿伺服常见现象报警及排除
  8. foobar2000实现用手机远程控制PC命令行版
  9. android+p+华为手机,Android P六大特性曝光支持刘海屏_华为 P20_手机新闻-中关村在线...
  10. Ubuntu 下实现类似Everything的功能
  11. Word插入特殊符号
  12. 高中低压电网光伏并网二次设计——分布式光伏电站并网市电通讯组网
  13. 使用教育邮箱享正版Jetbrains 套件,IDEA正版webstrom正版
  14. linux防护勒索病毒的补丁,抵御Petya勒索病毒的最新办法
  15. java 笔触类_下列属于笔触类型的绘图工具有那些?
  16. WAF绕过-漏洞发现之代理池指纹被动探针
  17. android 串口通信打开失败
  18. pdf怎么压缩,好用的pdf压缩工具介绍
  19. 关于WIN10开机无法输入密码的问题
  20. 【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令

热门文章

  1. 计算机管理器用户怎么打开文件,资源管理器怎么设置默认打开我的电脑
  2. Carsim2019_官方Help学习笔记_Running a VS FMU in Simulink (Carsim与Matlab联合仿真方法之一)
  3. php 验证 繁体,验证码上中文字是繁体
  4. 控制windows开关机代码
  5. 关于退火法的粗浅理解
  6. 2011年影响中国通信行业发展的十件大事
  7. 不用熬夜了,买菜 App 抢菜插件开源!
  8. C/C++关于行末空格的控制输出
  9. 如何获取本地时间信息,并把getDay()函数获取到的日期改为日一二三四五六
  10. 2022年湖南医院三基考试泌尿外科综合模拟题及答案