DLL 和线程的问题
Problems with DLL & threads
请帮我解决以下问题:
-
我实现了一个线程执行一些工作。此线程隐式调用一些外部 DLL。当然,我尽力处理这些 DLL 中可能出现的错误(使用 try ...catch),但无法处理意外错误(例如内存异常)。
-
如果其中一个 DLL 遇到问题(某处的错误或循环)并最终卡住,则此线程将永远不会完成(或关闭)。
在我的程序中,每个线程都与一个会话相关联(会话数有限)。假设所有线程都卡住,传入会话将不得不永远等待。
有没有办法强制线程停止,即使它仍在工作或卡住?
请注意,我正在使用带有 Boost 库的C++编程。
欢迎任何建议!
提前感谢!
操作系统的库可能具有强制终止线程的功能,但这是一个坏主意,除非您绝对确定这些 DLL 在做什么。在Windows上,这将是TerminateThread
。对于POSIX,我相信这是pthread_cancel
。
在外部终止线程的问题在于线程持有的任何资源都将泄漏。例如,线程打开的任何打开的文件都将保持打开状态,并且它所做的任何分配都将泄漏。
最好确保您的DLL永远不会卡住。我不会终止线程,而是会记录一些内容并调试问题发生的位置和原因。
你可以终止一个线程,但听起来好像你需要在你的线程周围有某种框架。
一种方法是拥有一个监视所有线程的看门狗线程。通过定期检查线程是否按预期运行,您可以确定是否需要终止一个(或多个)线程。
要确定线程是否正常工作,例如,可以在每个线程中都有一个消息队列,然后使用一些自定义消息来交换状态。
好吧,如果您无法访问库源代码并且完全无法控制其行为,那么最安全的解决方案可能是使用单独的进程而不是线程。当然,这将需要一个更精细的解决方案来为工人提供数据并获取他们的结果,但至少你可以安全地杀死挂起的工人并处理他们的任务(将他们发送到"未完成的邮箱",重新启动等)。
也许,根据正在完成的工作的性质,你应该看看Boost.MPI。
- 使用 ubuntu 终端在 c++ 上运行线程类的问题
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 餐饮哲学家问题 - 只有 2 个线程工作
- 线程过程中的线程同步问题
- 在 C++ 的 Qt 中使用 WINAPI 线程时出现问题
- 线程和互斥锁的使用有什么问题
- 并发问题:如何只有一个线程通过关键部分
- MFC执行线程问题
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- C++多线程生产者-消费者问题
- C++ 多线程中的锁和条件变量问题
- 线程清理器检测到数据争用,问题出在哪里?
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 多线程与线程小问题
- 线程池 C++ 实现问题
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- 如何修复macOS线程互斥锁性能缓慢的问题?
- 多线程概念问题
- 迷宫构造函数问题 [线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)]