我正在创建一个嵌入式Ruby框架,如果我正常运行/只运行一次,它就可以工作。当我试图在一个线程循环中运行它时,程序崩溃了。
有效的示例:
myRubyfile.rb:
def helloworld()
puts "Hello world"
end
工作main.cpp:
#include <ruby.h>
void runRuby()
{
ruby_init();
ruby_init_loadpath();
rb_require("myRubyfile");
rb_funcall(rb_mKernel, rb_intern("helloworld"), 0 , NULL);
ruby_finalize();
}
int main()
{
runRuby();
return 0;
}
上面的程序可以正确执行。
然而,我想在多个线程中运行几个Ruby脚本下面的例子运行一次就崩溃了。
Crashing main.cpp:
#include <ruby.h>
#include <thread>
void runRuby()
{
ruby_init();
ruby_init_loadpath();
rb_require("myRubyfile");
rb_funcall(rb_mKernel, rb_intern("helloworld"), 0 , NULL);
ruby_finalize();
}
int main()
{
for(int i = 0; i < 100; i++) {
std::thread mythread(runRuby);
mythread.join();
}
return 0;
}
我在Windows中运行此程序。
为什么这是失败的?
发布于 2014-10-21 19:38:33
它失败是因为Ruby VM不是线程安全的。你需要像在普通的Ruby中一样使用Ruby的Thread类。thread.c
具有您需要的大部分功能:
VALUE myThread(VALUE arg)
{
// ...
}
int main()
{
ruby_init();
VALUE threads[100];
for(int i = 0; i < 100; ++i)
threads[i] = rb_thread_create(RUBY_METHOD_FUNC(myThread), Qnil);
for(int i = 0; i < 100; ++i)
rb_funcall(threads[i], rb_intern("join"), 0);
return ruby_cleanup(0);
}
由于Ruby的线程不是真正并行的,真正并行加载和运行脚本的唯一方法是在不同的子进程中启动多个VM。
https://stackoverflow.com/questions/26488029
复制