社区
C++ 语言
帖子详情
C++多线程,安全,快速的结束线程。
cobra_chen
2012-03-31 01:31:35
怎么在线程外结束线程?
-
线程外包别人的一个函数。
HasCodingEx();
这个函数运行很耗时间,3min。
-
1.TerminateThread()很明显,不安全,但是很快速。用了之后,出现了内存泄露。
2.用信号,效率不高。
怎么才能两全?
...全文
666
21
打赏
收藏
C++多线程,安全,快速的结束线程。
怎么在线程外结束线程? - 线程外包别人的一个函数。 HasCodingEx(); 这个函数运行很耗时间,3min。 - 1.TerminateThread()很明显,不安全,但是很快速。用了之后,出现了内存泄露。 2.用信号,效率不高。 怎么才能两全?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Lactoferrin
2012-04-02
打赏
举报
回复
那个进程是干什么的?
如果正在更新某个公用的数据结构,就会导致那个数据结构处于不一致的状态
如果使用了semaphore来控制对某个资源的访问,这样就可能导致其他任务无限等待
Saleayas
2012-04-02
打赏
举报
回复
[Quote=引用 15 楼 的回复:]
哪有这么理想的事
用额外的进程能改善资源泄露,但可能导致一些不一致的状态
[/Quote]
能具体一下吗?
因为我在某个程序中就是这样做的。
序列化参数导入到该进程,结束后,在把返回的参数和返回值序列化导出到调用进程。
如取消,那么强制结束该进程。
请问,一下,有什么地方需要额外考虑的吗?因为我一直认为这样很好。
Saleayas
2012-04-02
打赏
举报
回复
谢谢,很多时候用这种模式去跑线程,就是因为算法包在完成其算法之前没有任何交互的东西。
如果使用了某个资源或者数据,外部甚至可以强制异常退出。
谢谢你的解释,因为我用这个方式的时候,就是纯粹的搜索和计算。
Canvas
2012-04-01
打赏
举报
回复
貌似ExitThread也可以吧
qq120848369
2012-04-01
打赏
举报
回复
各种pthread_cancel之类的函数都不应该被使用,尽量用条件变量+quit变量+mutex或者select+管道或者原子变量+信号。
看你线程本身的工作模型了。
pgy1987
2012-04-01
打赏
举报
回复
TerminateThread()在仅仅是内存泄露问题。如果线程正在一个critical section,你结束他,将被锁定。
结束线程前先捕捉异常,再结束他。
qq120848369
2012-04-01
打赏
举报
回复
当然是做事件通知的方式了, 如果线程里是条件变量阻塞,那么可以借助条件变量+退出标记。 如果线程是轮询的,可以设置全局原子变量,比如linux下的sig_autmic_t,设置好之后下一次轮询就退出了。
Lactoferrin
2012-04-01
打赏
举报
回复
哪有这么理想的事
用额外的进程能改善资源泄露,但可能导致一些不一致的状态
ustb_diego
2012-04-01
打赏
举报
回复
还是线程自己退出最安全,不要尝试terminal之类的函数
loongee
2012-04-01
打赏
举报
回复
[Quote=引用 9 楼 的回复:]
创建一个进程去跑这个函数。
[/Quote]
同意九楼,创建一个进程来跑,这样强制结束后也不会被内存泄露所影响。
teleinfor
2012-04-01
打赏
举报
回复
你难道没有办法控制别人线程的结束么?如果可以的话让他线程监听一个event即可,收到event通知直接return。其他的方式处理线程结束都不是常规的做法。我一般要求线程必须通过return返回结束。
线程间同步通过event等对象进行即可。
Kevin_qing
2012-03-31
打赏
举报
回复
同LS
Saleayas
2012-03-31
打赏
举报
回复
创建一个进程去跑这个函数。
jiuchang
2012-03-31
打赏
举报
回复
用全局变量把内存地址保存下来,这样在线程退出后就可以释放了
cobra_chen
2012-03-31
打赏
举报
回复
或者说,我可以申请一段内存,让线程在这段内存中运行么?
TerminateThread之后清除这段内存,这样可以实现么?
[Quote=引用 6 楼 的回复:]
引用 2 楼 的回复:
不需要回传通知。
只要结束线程。
线程函数体也很简单,就是一个函数的调用。
可以给点代码么?
函数运行1min的时候,我要结束线程。
还要保证资源被释放。
-
这个函数结束的时候会自动释放,但是我无法修改别人的代码。
引用 1 楼 的回复:
发event通知结束线程,让对方自己处理收尾释放工作,需要的话,结束以后再event通知你ove……
[/Quote]
loongee
2012-03-31
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
不需要回传通知。
只要结束线程。
线程函数体也很简单,就是一个函数的调用。
可以给点代码么?
函数运行1min的时候,我要结束线程。
还要保证资源被释放。
-
这个函数结束的时候会自动释放,但是我无法修改别人的代码。
引用 1 楼 的回复:
发event通知结束线程,让对方自己处理收尾释放工作,需要的话,结束以后再event通知你over了
[/Quote]
无法修改别人的代码?线程里面跑的函数是别人的代码?那个人认为除了Terminate应该没其它办法了……
cobra_chen
2012-03-31
打赏
举报
回复
是要在线程外部结束线程啊。
线程外部,如何成对?
[Quote=引用 3 楼 的回复:]
_beginthread和_endthread成对使用
[/Quote]
xiaoyu_code
2012-03-31
打赏
举报
回复
[Quote=引用 3 楼 的回复:]
_beginthread和_endthread成对使用
[/Quote]
+
ayrfover
2012-03-31
打赏
举报
回复
_beginthread和_endthread成对使用
cobra_chen
2012-03-31
打赏
举报
回复
不需要回传通知。
只要结束线程。
线程函数体也很简单,就是一个函数的调用。
可以给点代码么?
函数运行1min的时候,我要结束线程。
还要保证资源被释放。
-
这个函数结束的时候会自动释放,但是我无法修改别人的代码。
[Quote=引用 1 楼 的回复:]
发event通知结束线程,让对方自己处理收尾释放工作,需要的话,结束以后再event通知你over了
[/Quote]
加载更多回复(1)
C++
多
线程
编程视频教程(
C++
11
多
线程
并发)
线程
与进程相比,它是一种花销小,...多编程并发在企业中开发显得尤为重要,本课程包含Windows
多
线程
编程与
C++
11高并发编程,通过浅显易懂的代码与讲解,让你的
多
线程
编程能力得到质的飞跃,具备开发高并发代码的能力!
C++
多
线程
详细讲解
C++
多
线程
基础教程 目录 1 什么是
C++
多
线程
? 2
C++
多
线程
基础知识 2.1 创建
线程
2.2 互斥量使用 lock()与unlock(): lock_guard(): unique_lock: condition_variable: 2.3 异步
线程
async与future: shared_future ...
一文详解
C++
多
线程
传统的
C++
(
C++
11之前)中并没有引入
线程
这个概念,在
C++
11出来之前,如果我们想要在
C++
中实现
多
线程
,需要借助操作系统平台提供的API,比如Linux的,或者windows下的<windows.h> 。
C++
11提供了语言层面上的
多
线程
,...
C++
多
线程
安全
用代码把共享数据锁住,其他尝试操作共享数据的
线程
必须等待 锁定->操作->解锁 头文件#include<mutex> lock() unlock()是mutex的成员函数,成对使用,有lock必然要有unlock using namespace std; ...
C++
多
线程
编程
C++
11发布之前,
C++
并没有对
多
线程
编程的专门支持,
C++
11通过标准库引入了对
多
线程
的支持,大大方便了程序员的工作,本篇我们对这部分进行简要的介绍。需要说明的是,
C++
11标准库内部包裹了pthread库,因此,编译...
C++ 语言
64,691
社区成员
250,497
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章