私がブラックボックスとして扱っている古い (しかし複雑な) 数値ライブラリを扱っていると、ライブラリが再入可能ではないことがわかりました。したがって、複数のスレッドから安全に呼び出すことができるようにするために、スレッドセーフなキューによって管理されるライブラリの複数のコピーを作成しました。詳細については、次の質問を参照してください。
基本的に、私はライブラリを持っており、通常は私のマシンのプロセッサの数をからまでにmvnpack.so
コピーしました。次に、これらのそれぞれが JNA インターフェースにマップされます。コピー自体はバイトと同じです。n
n
mvnpack.so.i
i
0
n-1
NaN
これによりライブラリのスループットが向上し、並行して使用できるようになると思いましたが、ライブラリには、奇妙な数値結果、ランダムに返される値など、再入可能性の問題の症状がまだ見られます。他のすべての問題であり、答えは私が十分に知らない質問のようです:
同じコードでファイル名が異なる複数の同一の共有ライブラリを同じプロセスのメモリ空間にマップした場合、それらが引き続きメモリを共有する場合はありますか?
以前の質問に対する回答からは、このようなことは起こらないと思われますが、そのように思われます。この場合、これらのコピーがメモリを共有するのを防ぐために使用できるコンパイラまたはリンカー オプションはありますか? gfortran
( ) を使用しgcc
て、JNA によって Java プロセスにマップされている共有ライブラリをコンパイルしています。