您好。
我有一个需要执行操作的后台线程,除了一种情况外,它在所有时间都能正常工作:资源损坏时。当发生这种情况时,线程在Execute方法的Load(到该资源)调用中被阻塞。
当发生这种情况时,线程将不响应Terminate方法(从主线程调用)并被阻止。
所以,我的问题是:如何正确终止被阻塞的线程(来自主线程)。并且我不能修改加载资源的类,或者既不知道资源是否已损坏。
答案 0 :(得分:1)
查找TerminateThread()
WinAPI函数。
可以找到一些有用的解释here或查看MSDN文档。
当然,在终止之后,你必须查看线程中分配的任何资源是否未被释放并正确释放它。
更新
是的,使用TerminateThread
是不好的做法(在评论中指定)。我同意这个意见。但是“永远不要使用它,即使你真的需要使用它”,从我的角度来看它太强大并且非常理论上的推荐。现实世界充满了设计缺陷和有缺陷的第三方图书馆
提供的信息不足以对这一具体情况做出正确的决定。例如。它可能是临时的解决方法,没有替代品等。
因此,从理论的角度来看,正确答案是:“如果无法控制如何在后台线程中处理”冻结“步骤,则无法正常终止处理。”
从实际的角度来看,正确答案是:“如果无法控制如何在后台线程中处理”冻结“步骤,则无法正常终止进程。但如果你意识到你不能,但仍然需要这样的功能 - 使用TerminateThread()API调用“
关于TerminateThread与TerminateProcess:
- 创建/终止过程比创建/终止线程需要更多资源
- 创建/终止过程更复杂=>更多地方的虫子
- TerminateProcess不会立即终止并等待I / O操作完成(MSDN)=>在阅读和其他类似的I / O场景中,远程共享文件夹不可用的场景不是一种选择
- 创建和终止流程需要比创建线程更多的用户权限,比较MSDN here和here
关于资源释放:
终止线程时线程堆栈自动释放(在MSDN中为mentonied)。资源主要是资源,由主线程分配,用于与后台线程进行通信。例如。记忆结构,互斥体等。