1

我想在 ruby​​ 线程中运行 Matlab 引擎(使用 gem matlab-ruby)。这个想法是使用 ruby​​ 将我的 Matlab 进程分布到不同的内核上。但是,当我尝试从线程内部启动新引擎时,会出现 Trace/BPT 陷阱:5 错误。

我是红宝石的新手,所以在线程等方面没有那么强。我正在尝试做的事情是可能的,还是只是那些无法完成的事情之一?

需要'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

我问是因为我在使用不同库(Sinatra/ActiveRecord/pg/等)的 Trace/BPT 时遇到了问题,并且在 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 回答