如何在一个线程中结束另一个线程

就想叫yoko 2011-09-20 10:24:12
加精
以前我一直遵循老师教的方法, 在分线程中死循环判断一个BOOL变量, 主线程需要结束分线程时去设置这个BOOL变量的值使它自然退出

该方法分线程并不是立即被杀死的, 它必须走完此次循环到判断BOOL变量处才能结束

1. 如果有一些对象是主、分线程都要访问的, 那么可能在主线程中已经释放了它们而分线程任然访问它, 造成非法访问
2. 我有想过将这些对象的释放放在分线程判断BOOL变量退出线程时执行, 但是主线程的逻辑是很有可能在杀死分线程后又建立一个分线程, 此时根据这些对象是否存在而判断是否创建,这样旧的分线程暂时没有释放对象导致新线程建立时没有建立对象之后这些对象又被旧线程释放, 造成非法访问
3. 后来我又想在主线程wait分线程退出后再释放对象, 但如果分线程中有一些比较耗时的操作(例如IO。下载、解压等等), 那么主线程阻塞太久了

我想问问大家一般怎么解决这个问题。
1. 使用TerminateThread到底会导致哪些不良后果呢, 线程是否在TerminateThread执行结束后立即被杀死呢
我个人认为由于被杀死的线程不知道执行到何处, 可能会出现一些new了的资源、打开的句柄没有被释放, 不知道是否有其他坏处
2. 其他一些语言中封装好的线程类例如java中的interrupt是否也存在这个问题
3. 我现在遇到的问题是否都是因为主、分线程访问同一对象导致的(其实就相当于全局变量带来的危害一样), 是否应该完全避免
4. 大家在程序设计的时候一般都是怎么解决在一个线程中结束另一个线程的
...全文
11017 122 打赏 收藏 转发到动态 举报
写回复
用AI写文章
122 条回复
切换为时间正序
请发表友善的回复…
发表回复
虎斑大灰猫 2013-08-14
  • 打赏
  • 举报
回复
虽然还是没明白 。顶一下吧
awingsky 2012-11-13
  • 打赏
  • 举报
回复
我一般不直接强制结束线程,而是采用bool变量是线程主动结束,同时采用信号量同主线程保持同步。
ligangdili 2012-06-11
  • 打赏
  • 举报
回复
你的程序本身可能就有些问题,当进行接收发送数据等操作时,本身就应该是一个限时操作,而不能无休止的进行,正常应该有超时时间限制,这样,只要达到了超时时间或者线程操作完成,都可以正常结束子线程。
zjh0003 2011-09-27
  • 打赏
  • 举报
回复
设置一个线程退出标志
emptyness 2011-09-27
  • 打赏
  • 举报
回复
1.全局变量 或长期存在的独有变量 挺好的. 对于判断线程是否该退出,脏读无所谓. 出现脏读,下一次读就对了.多等一次读的时间而已.
2. 线程可以休眠 等待在 系统对象mutex,event上,这个是比全局变量优秀的地方. 前者若要休眠只能使用
while(1)
{
if(!退出)
{
干活, sleep(几秒);
}
}
这种糟糕的方式.
因为大多数情形: 一个线程 一开 就是干活干到死. 没活干就休眠, 别处有活就刺激他.
所以基本上都是使用系统对象 便于使用waitobjects系列函数.
酒红色的泪 2011-09-26
  • 打赏
  • 举报
回复
建议读一下有关内核对象的知识
gucheng789 2011-09-26
  • 打赏
  • 举报
回复

留个位置
dyzyc 2011-09-26
  • 打赏
  • 举报
回复
不错还可以
yujie_v 2011-09-26
  • 打赏
  • 举报
回复
学习下……
soliddream66 2011-09-26
  • 打赏
  • 举报
回复
线程同步的问题,还是去看看Windows核心编程吧。

RX_SESSION 2011-09-25
  • 打赏
  • 举报
回复
学习下
perfecthcm123 2011-09-25
  • 打赏
  • 举报
回复
学习学习学习
fengxz1985 2011-09-25
  • 打赏
  • 举报
回复
学习下。。。虽然不搞C,但是思想是一样的
dengxiuping99 2011-09-25
  • 打赏
  • 举报
回复
martinblade 2011-09-24
  • 打赏
  • 举报
回复
学习了
Jesse621 2011-09-24
  • 打赏
  • 举报
回复
mark
phlen 2011-09-24
  • 打赏
  • 举报
回复
标记,学习学习
two8c 2011-09-24
  • 打赏
  • 举报
回复
用一个event对象,在线程函数的开头去判断这个对象的状态,一般就等10ms,如果有信号就结束自己,如果没有信号就执行本线程想要做的事情。

用另一个线程去执行setevent,这样event就有信号,那么等event的线程就可以返回有信号,而不是超时。
assassin5616 2011-09-23
  • 打赏
  • 举报
回复
关于第三条,楼主对锁这些东西都没有概念吗?这个需要好好恶补一下
caochen158 2011-09-23
  • 打赏
  • 举报
回复
好东西 学到了
加载更多回复(95)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧