首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CPP线程中的嵌入Ruby崩溃

CPP线程中的嵌入Ruby崩溃
EN

Stack Overflow用户
提问于 2014-10-21 21:33:48
回答 1查看 222关注 0票数 1

我正在创建一个嵌入式Ruby框架,如果我正常运行/只运行一次,它就可以工作。当我试图在一个线程循环中运行它时,程序崩溃了。

有效的示例:

myRubyfile.rb:

代码语言:javascript
运行
复制
def helloworld()
    puts "Hello world"
end

工作main.cpp:

代码语言:javascript
运行
复制
#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:

代码语言:javascript
运行
复制
#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中运行此程序。

为什么这是失败的?

EN

回答 1

Stack Overflow用户

发布于 2014-10-22 03:38:33

它失败是因为Ruby VM不是线程安全的。你需要像在普通的Ruby中一样使用Ruby的Thread类。thread.c具有您需要的大部分功能:

代码语言:javascript
运行
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26488029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档