2017-01-19 4 views
0

私はfortranサブルーチンを持っています。一度起動するとかなり長い時間がかかります。スタック変数のみを使用してスレッドを削除することは安全ですか?

ここで、C++のfortranサブルーチンをスレッドで呼び出すプログラムを記述したいと思います。 ユーザーが要求したときにスレッドを停止(またはキャンセル)する必要があります。 しかし、サブルーチンは実行中に計算を終了するメソッドをサポートしていません。

私が知る限り、サブルーチンはスタック変数(割り当てなし)のみを使用します。 サブルーチンは、Windows用の静的ライブラリ(.libファイル)によって与えられます。

この場合、サブルーチンスレッドを強制終了してもリソースが漏れてしまうなどの問題は発生しないものとしますか?

FYI、ここで実行している環境だ:

  • OS:Windows 7の64ビットまたは
  • 上記コンパイラ:C++用MSVC 2015、Intelは一般的に、それは安全ではありませんFORTRAN
+0

あなたのケースでは、コードに直接スタック/ヒープリークはありませんが、スレッドを強制終了する(つまり、強制終了するのとは異なります)場合は、OSがリークする可能性があります基礎となるスレッドのハンドルをきれいに整理しました。Fortranは、ランタイムAPIを介して呼び出されるものですか、それともプロセスですか? 'do_run'フラグをチェックするスレッドで何らかの制御ループを行うことができ、' do_run'がfalse(ユーザの介入によって)のときにループが終了し、Fortranプロセスがそのように殺される可能性がありますそれ) ...? – txtechhelp

+0

@txtechhelpご意見ありがとうございます。私は本当にスレッドを正常に終了するフラグを追加したい。しかし、私はサブルーチンのソースコードを持っていません。私はライブラリとしてしか持っていないので、サブルーチンを修正することは悲しいことではない。 – xylosper

+0

@txtechhelpまた、C/C++から呼び出すサブルーチンのプロトタイプがあり、サブルーチンはC++側から直接呼び出されます。私が知る限り、サブルーチンはいくつかの行列計算を実行するだけです。 – xylosper

答えて

1

ためParallel Studioを - メモリ以外にスレッドが獲得できる他のリソースがあります。たとえば、mutexをロックする可能性があります。mutexがロックされている間にスレッドを強制終了すると、mutexは永久にロックされたままになります。本当にスレッドをクリーン/自発的に終了させる方法がない場合、唯一の安全な方法は、子プロセスを生成し、子プロセス内でルーチンを実行することです。 OSが子プロセスによって割り当てられたリソースを自動的にクリーンアップするので、必要があれば子プロセスを安全に終了できます。

関連する問題