Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 仅使用堆栈变量终止线程安全吗?_Multithreading_Kill - Fatal编程技术网

Multithreading 仅使用堆栈变量终止线程安全吗?

Multithreading 仅使用堆栈变量终止线程安全吗?,multithreading,kill,Multithreading,Kill,我有一个fortran子程序。一旦启动,它会运行相当长的时间 现在,我想编写一个程序,它调用线程中C++的FORTRAN子程序。 当用户请求时,应停止(或取消)线程。 但子例程不支持在运行期间终止计算的任何方法 据我所知,子例程只使用堆栈变量(没有分配)。 子例程由windows的静态库(.lib文件)提供 在这种情况下,我是否可以假设终止子例程线程不会导致任何问题,例如资源泄漏 仅供参考,以下是运行环境: 操作系统:Windows 7 64位或更高版本 编译器:C++的MSVC 2015,英

我有一个fortran子程序。一旦启动,它会运行相当长的时间

现在,我想编写一个程序,它调用线程中C++的FORTRAN子程序。 当用户请求时,应停止(或取消)线程。 但子例程不支持在运行期间终止计算的任何方法

据我所知,子例程只使用堆栈变量(没有分配)。 子例程由windows的静态库(.lib文件)提供

在这种情况下,我是否可以假设终止子例程线程不会导致任何问题,例如资源泄漏

仅供参考,以下是运行环境:

  • 操作系统:Windows 7 64位或更高版本
  • 编译器:C++的MSVC 2015,英特尔并行工作室fortran < /LI>
一般来说,这是不安全的——除了内存之外,线程还可以获取其他资源。例如,它可以锁定一个互斥体,如果在该互斥体被锁定时终止线程,该互斥体将永远保持锁定状态,可能导致其他线程将永远死锁,等待获取互斥体。如果您真的无法让线程干净/自动地退出,那么唯一安全的方法就是生成一个子进程并在子进程内运行例程。如果必须,您可以安全地杀死子进程,因为操作系统将自动清理子进程分配的所有资源。

在您的情况下,您不会有任何堆栈/堆泄漏直接泄漏到代码,但是如果您杀死线程(即强制杀死它而不是让它正常结束),那么操作系统可能有漏洞,因为它可能没有正确清理底层线程句柄。。Fortran调用是通过运行时API调用的,还是一个过程?您可以在检查
do_run
标志的线程中执行某种类型的控制循环,当
do_run
为false时(通过用户干预),循环结束,Fortran进程可能会以这种方式终止(或使用其他钩子停止).?@txtechhelp感谢您的评论。我真的想添加一些标志来优雅地退出线程。但是,我没有子例程的源代码。我只把它当作一个库,所以修改子程序不是我的选择,很遗憾。@ TXTeaSufter,我有一个子程序,用C++从C++调用它,子程序是从C++直接调用的。据我所知,子程序只是运行一些矩阵计算。我认为不可能肯定地回答这个问题,特别是因为我们不知道我们在谈论什么操作系统、编译器等。我建议进行一些严格的测试。如果这是一个库调用,也就是说,如果您的原型进入另一个DLL/SO文件,那么您可能运气不好;您可能能够实现的最多功能是生成线程,然后使用同步对象来检测何时完成。