C++多线程,安全,快速的结束线程。

cobra_chen 2012-03-31 01:31:35
怎么在线程外结束线程?
-
线程外包别人的一个函数。
HasCodingEx();
这个函数运行很耗时间,3min。
-
1.TerminateThread()很明显,不安全,但是很快速。用了之后,出现了内存泄露。
2.用信号,效率不高。
怎么才能两全?
...全文
666 21 打赏 收藏 转发到动态 举报
写回复
用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)

64,691

社区成员

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

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