当前位置: 首页 > 知识库问答 >
问题:

仅使用堆栈变量杀死线程是否安全?

储峻
2023-03-14

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

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

  • 操作系统:Windows 7 64位或以上
  • 编译器:MSVC 2015 for C++,Intel Parallel Studio for Fortran

共有1个答案

何骞尧
2023-03-14

一般来说,这是不安全的--除了内存之外,线程还可以获取其他资源。例如,它可以锁定一个互斥体,如果在锁住互斥体的同时杀死线程,那么该互斥体将永远保持锁住,结果可能是其他线程将死锁,永远等待获取该互斥体。如果您真的没有办法让线程干净/自愿地退出,那么唯一安全的方法就是生成一个子进程并在子进程内运行例程。如果有必要,您可以安全地杀死子进程,因为操作系统将自动清除由子进程分配的任何资源。

 类似资料:
  • 问题内容: 问题答案: 调用stop的替代方法是使用中断向线程发出信号,告知你希望它完成其工作。(这假设你要停止的线程行为良好,如果它在抛出异常后立即通过吃掉它们而忽略了InterruptedException,并且不检查中断状态,那么你将返回使用stop()。) 下面是一些代码,我写的一个答案,一个线程的问题在这里,它的线程中断,将如何工作的例子: 要注意的一些事情: 中断原因并立即抛出,否则你

  • 问题内容: 我想知道如何“杀死”已启动的过程。我知道Process API,但是不确定,是否可以使用它来杀死已经运行的进程,例如firefox.exe等。如果可以使用Process API,可以请您指向正确的方向?如果没有,还有哪些其他可用选项?谢谢。 问题答案: 如果你从Java应用程序中以从头开始处理(例如,通过调用或),那么你将对其具有有效的引用,并且可以在Process类中调用该方法以终止

  • 问题内容: 我有一个简单的程序,可以测试当模块不存在时是否能够引发异常。 有时我喜欢在另一个模块中使用此代码: 令人惊讶的是,当我以这种方式运行它时,它不起作用: 这种情况在Ubuntu中发生,并且在干净的CentOS 7.3中也发生。 问题答案: 您正在遇到“导入锁定”。 该文档提到了线程期间导入的限制,您违反了第一个限制(强调我的意思): 虽然导入机制是线程安全的,但是由于提供线程安全的方式存

  • 问题内容: 在Java多线程中,术语和之间在语义上有区别吗? 问题答案: 每个线程都有自己的调用堆栈,“调用堆栈”和“线程堆栈”是同一件事。将其称为“线程堆栈”只是强调了调用堆栈特定于线程。 Bill Venners将此称为Java堆栈: 启动新线程时,Java虚拟机将为该线程创建一个新的Java堆栈。如前所述,Java堆栈将线程的状态存储在离散的帧中。Java虚拟机仅直接在Java堆栈上执行两项

  • 问题内容: 我对Java不太了解。 我浏览了几个链接,发现博客上写着“ Java Primitives存储在堆栈上”,我觉得这取决于实例变量或局部变量。 经过几个链接后,我的结论是, 类变量(基元)作为对象包含的对象的一部分存储在堆中。 类变量– object(用户定义)–作为其包含的Object的一部分存储在堆中。对于参考对象和实际对象都是如此。 方法变量-基元-作为该堆栈框架的一部分存储在堆栈

  • 问题内容: Go进程正在运行。我想要 为每个goroutine转储堆栈跟踪 从外部,而不依赖于我添加到其源代码的任何内容 没有杀死它。 我怎样才能做到这一点? 这应该很容易-请求该功能:https : //code.google.com/p/go/issues/detail?id=2516并根据该线程的结论进行了实施。那是两年多以前了。但是问题线程和提交都没有任何有关如何调用此功能的提示。 功能请