私たちは積極的に開発しているfortranバイナリに裏打ちされたJavaアプリケーションを持っています。私は主にJava側であり、Fortran上で作業する人たちをいくつかの厄介なシステムから保護し、並行処理のようなものや、複雑なAPIを公開しないようにすることを私は考えています。コールスタックは言語安全なデータ構造ですか? Quasar + Fortran?
私がこれらの行に沿って行った決定は、JavaからFortranバイナリにJNAスタイルのコールバックを渡すことでした。このコールバックが実行されます場合は、私たちのコールスタックは、次のようになります。
UIframework.click.java -- com.sun#1234
OurCode.UIHandlers.java -- our.code#2345
OurCode.doHeavyComputation.java -- our.code#4567
JNASurrogates.java -- com.sun.jna#456
JNASurrogates.proxy.f99 -- com.sun.proxies
HeavyComputation.f99 -- /code/algorithm.f99#1234
JNASurrogates.executeCallback.proxy.f99 -- com.sun.proxies
JNASurrogates.java -- com.sun.jna#1234
OurCode.computationComponents.java -- our.code#6789
//bottom of callstack
私の質問は、スレッドのいずれかですでしょう2つのスレッドは、メモリ内の同じFORTRAN DLLにアクセスする方法を扱うこと?私の質問は、コールスタックがメモリ内でどのように処理されるかについての正確な情報に基づいています:FortranコンパイラがJNAから呼び出すことができるコードを生成するためには、コールスタックが格納される場所についてのJVMとの理解を共有しました。 X86は、Pthreads
、java.lang.Thread
、およびその他のスレッドライブラリをすべて活用してコールスタックを安全に分離できる、何らかの種類のプログラムカウンタコンテナを提供していますか?
私もQuasarを使用して議論してる事が本当に面白くするには - なじみのない人のために、クエーサーは、それがstackfulコルーチンによって実装「軽量スレッド」であり、「繊維」、呼んでいます、つまり、Quasarはスタックフレームの直接操作を実行します。
問題は、私が概念的にはOurCode.computationComponents
をコールバックとして公開していることですが、ビジネス上の要件によっては気にしないことがあります。有名なFortranのプログラマーに、既存のコードを明示的な入り口と戻り(返り)ポイントで変換するように依頼するのではなく、既存のコードを活用するためにむしろコルーチンを使用します。
アイデアは、コルーチンがOurCode.computationComponents.java
で収率はdoHeavyComputation
の呼び出し元へ戻り値としてHeavyComputation.f99
によってcomputationComponents
に渡された引数をもたらすであろうことであろう。呼び出し側はその後、computationComponents
に戻っもたらすであろうし、最終的に戻ってHeavyComputation.f99
に私はもちろんのブロッキングキューでこのすべてを行うことができ、resumeHeavyComputation
とそのからに結果を渡し、computationCompoenntsが通常行うコールバックという仕事をするだろうし、 1つのスレッドを使用することに自分自身を制限しようとすると、私はいくつかのQuasarに暴露されます。
Quasarでは、使用しているスタックと同じ複雑なスタックを安全に復元できますか?