1

Ruby スレッド内で (gem matlab-ruby を使用して) Matlab エンジンを実行したいと考えています。Ruby を使用して、Matlab プロセスを異なるコアに分散するというアイデアです。しかし、スレッド内から新しいエンジンを開始しようとすると、Trace/BPT トラップ: 5 エラーが発生します。

私はルビーに慣れていないので、スレッドなどにはそれほど強くありません。私がやろうとしていることは可能ですか、それともできないことの 1 つにすぎませんか?

「matlab」が必要

t1=Thread.new do
  engine = Matlab::Engine.new
  engine.put_variable "x", 10
  engine.put_variable "y", 22
  engine.eval "z = x * y"
  puts engine.get_variable "z"
end
t1.join
4

1 に答える 1

1

Matlab::Engineメインスレッドで a をインスタンス化し、後でコードをそのまま実行するとどうなるのだろうか。

Matlab::Engine.new  # side effect of loading the dynamic lib
t1=Thread.new do
  engine = Matlab::Engine.new
  engine.put_variable "x", 10
  engine.put_variable "y", 22
  engine.eval "z = x * y"
  puts engine.get_variable "z"
end
t1.join

Trace/BPT と別のライブラリ (Sinatra/ActiveRecord/pg/etc.) で問題が発生し、GBD で Ruby を実行すると、次のバックトレースでクラッシュしたため、質問します。

#0  0x00007fff89308590 in __CFInitialize ()
#1  0x00007fff5fc0d5ce in __dyld__ZN16ImageLoaderMachO11doImageInitERKN11ImageLoader11LinkContextE ()
#2  0x00007fff5fc0d607 in __dyld__ZN16ImageLoaderMachO16doInitializationERKN11ImageLoader11LinkContextE ()
#3  0x00007fff5fc0bcec in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#4  0x00007fff5fc0bc9d in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#5  0x00007fff5fc0bc9d in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#6  0x00007fff5fc0bc9d in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#7  0x00007fff5fc0bda6 in __dyld__ZN11ImageLoader15runInitializersERKNS_11LinkContextE ()
#8  0x00007fff5fc08fbb in __dyld_dlopen ()
#9  0x00007fff888a7e40 in dlopen ()
#10 0x0000000100001419 in dln_load ()
#11 0x000000010016ad19 in rb_vm_call_cfunc ()
#12 0x0000000100044d22 in rb_require_safe ()

検索すると、SBCL のこのバグ レポートにたどり着きました。これは、動的ライブラリがメイン スレッドによってのみロードされる可能性があることを示唆しています。

于 2012-09-07T14:09:17.853 に答える