仅使用堆栈变量终止线程是否安全?
Is it safe to kill thread using only stack variables?
我有一个 Fortran 子例程。启动后会运行很长时间。
现在,我想编写一个程序,在线程中从 C++ 调用 fortran 子例程。
当用户请求时,线程应该停止(或取消)。
但是子程序不支持任何方法来终止计算运行.
据我所知,该子例程仅使用堆栈变量(无分配)。
子例程由 windows(.lib 文件) 的静态库给出。
在这种情况下,我可以假设杀死子程序线程不会导致资源泄漏等问题吗?
仅供参考,这是 运行 环境:
- OS: Windows 7 64位或以上
- 编译器:MSVC 2015 for C++,Intel Parallel Studio for fortran
一般来说这是不安全的 -- 除了内存之外,线程还可以获得其他资源。例如,它可以锁定一个互斥量,如果您在互斥量被锁定时终止线程,则互斥量将永远保持锁定状态,结果可能是其他线程将死锁,永远等待获取互斥量。如果你真的没有办法让线程退出 cleanly/voluntarily,那么唯一安全的方法是生成一个子进程,运行 子进程中的例程。如果必须,您可以安全地终止子进程,因为 OS 将自动清理子进程分配的所有资源。
我有一个 Fortran 子例程。启动后会运行很长时间。
现在,我想编写一个程序,在线程中从 C++ 调用 fortran 子例程。 当用户请求时,线程应该停止(或取消)。 但是子程序不支持任何方法来终止计算运行.
据我所知,该子例程仅使用堆栈变量(无分配)。 子例程由 windows(.lib 文件) 的静态库给出。
在这种情况下,我可以假设杀死子程序线程不会导致资源泄漏等问题吗?
仅供参考,这是 运行 环境:
- OS: Windows 7 64位或以上
- 编译器:MSVC 2015 for C++,Intel Parallel Studio for fortran
一般来说这是不安全的 -- 除了内存之外,线程还可以获得其他资源。例如,它可以锁定一个互斥量,如果您在互斥量被锁定时终止线程,则互斥量将永远保持锁定状态,结果可能是其他线程将死锁,永远等待获取互斥量。如果你真的没有办法让线程退出 cleanly/voluntarily,那么唯一安全的方法是生成一个子进程,运行 子进程中的例程。如果必须,您可以安全地终止子进程,因为 OS 将自动清理子进程分配的所有资源。