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

CPP线程中的嵌入Ruby崩溃
EN

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

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

有效的示例:

myRubyfile.rb:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def helloworld()
    puts "Hello world"
end

工作main.cpp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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
代码运行次数:0
运行
AI代码解释
复制
#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-21 19:38:33

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
Octopress中嵌入ruby代码如何不被解析
用Octopress写博客即将快一年了,感觉自己用的还可以,并且借此熟练使用了Markdown,但是前几天写一篇关于如何在Octopress中集成多说评论的文章的时候,遇到了一个代码高亮的问题,就是如何处理代码块的问题。
技术小黑屋
2018/09/04
4550
一个线程崩溃会引起整个进程崩溃_大量线程状态waiting
建议74:警惕线程的IsBackground 在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性。两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就会一直存在,必须所有的前台线程全部退出,应用程序才算退出。而后台进程则没有这方面的限制,如果应用程序退出,后台线程也会一并退出。 查看以下代码:
全栈程序员站长
2022/11/03
7830
一个线程崩溃会引起整个进程崩溃_大量线程状态waiting
美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃
网上看到一个很有意思的美团面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但发现都没答到根上,所以决定答一答,相信大家看完肯定会有收获,本文分以下几节来探讨
kunge
2022/09/02
2.2K0
美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃
cpp继承中的那些事(上)
我们都知道(确性),面向对象的三大特性是封装、继承、多态,封装是基础,继承是关键,多态是补充,看吧,继承是关键,这么关键的东西我们当然有必要好好了解一下啦。
T1Am0
2022/09/13
4310
Cpp(十一) yaml-cpp的使用
YamlCpp #1 环境 macOS 10.15.5 Cmake #2 安装 git clone git@gitee.com:Coxhuang/yaml-cpp.git cd yaml-cpp mkdir build cd build # 二选一 # 静态库 cmake .. # 动态库 cmake .. -D BUILD_SHARED_LIBS=ON make sudo make install 安装后,库文件和头文件路径: 头文件: /usr/local/include/yaml-cpp
Autooooooo
2021/03/02
3.3K0
Cpp(七) std::thread 标准库多线程
但是使用mutex是不安全的,当一个线程在解锁之前异常退出了,那么其它被阻塞的线程就无法继续下去。
Autooooooo
2020/11/09
8510
Ruby(3):基本语法中
字符串分割成数组: 可以使用先scan再join的方法,当然其实有更好的 split方法,专门用来分割字符串 1 # 在Ruby中,如果不使用inspect,直接使用puts输出数组,那么每个元素会占用一行输出 2 irb(main):001:0> puts "Short sentence.Another.No more".split(/\./) 3 Short sentence 4 Another 5 No more 6 => nil 7 irb(main):002:0> puts "Short se
SecondWorld
2018/03/14
9800
辨析 Ruby 中的 Method 与 Proc
Ruby 与 Python、Scala 类似,在一切皆是对象(Seeing Everything as an Object)的基础上,支持函数式编程,这意味着函数是一等成员,可以作为参数传入,也可以作为函数值返回。
飞驰的西瓜
2022/07/26
9350
辨析 Ruby 中的 Method 与 Proc
Effective_Cpp中的55个建议
本文将Effective C++中55条建议的关键内容进行了记录和总结。 注:本文适合用来复习,无法用来代替第一遍学习。 其中有几条还有待复习,在前面标注了?。 模板与泛型编程部分略过了几条,现在还读不太懂,相信有了更多的经验之后再来读第二遍,会有更多的收获。
yifei_
2022/11/14
6130
iOS 中各种奇怪的崩溃
注意,本文所有崩溃的原因都是同一个 EXC_BAD_ACCESS (code=1, address=0x11f645b98) image-20210423232626879 第一个堆栈:字典扩容 im
酷酷的哀殿
2021/04/26
1.7K1
iOS  中各种奇怪的崩溃
Docker 中的 PostgreSQL 崩溃恢复记录
在 Docker 中运行的 PostgreSQL 数据库突然无法启动, 错误日志类似这样:
beginor
2020/12/18
1.8K0
KVC中setValuesForKeysWithDictionary 崩溃问题
KVC 是键值编码,一个非正式的 Protocol ,提供一种机制来间接访问对象属性,KVO 就是基于 KVC 实现的关键技术之一 在字典数组转模型数组时,使用这个setValuesForKeysWi
LeeCen
2018/10/11
9660
KVC中setValuesForKeysWithDictionary 崩溃问题
Ruby学习笔记之升级ruby的版本
升级ruby版本,有时候安装ruby的版本过低,需要进行升级,例如安装在centos6.7安装fpm需要ruby版本在1.9以上。
Jetpropelledsnake21
2019/04/25
3.2K0
Cpp(二) 创建Cpp工程
GitHub例子:https://github.com/Coxhuang/FKCpp/tree/master/1.first_demo
Autooooooo
2020/11/07
7360
c++的queue在多线程下崩溃原因分析
我们知道c++的queue和map等数据结构是线程并发不安全的,为此我们常封装实现了线程安全的priority_queue,姑且叫做 thread_safe::priority_queue。(关于c++并发编程这块儿推荐经典书籍《C++并发编程实战》)。本以为封装后就可以放心在多线程中使用了,结果崩溃了,且还是偶发的。
杨永贞
2022/06/30
1.2K0
c++的queue在多线程下崩溃原因分析
cpp的union使用
运行结果为4,实际上上面代码定义的union就是两个变量共用同一块内存。union的大小为最大的那一个变量。
Andromeda
2023/10/21
2550
Ruby中如何识别13位的时间戳
由于13位的时间戳在Ruby中是比较另类的,以为Ruby中默认的时间戳都是10位的。而Time和Date是Ruby中常用的处理时间的模块。 由于最初遇到问题的时候网上搜了好久都没找到合适的,因此就自己写一下,帮助下再次遇到这个问题的小伙伴们吧! 使用Time解决 使用Time的方式比较投机取巧吧。 require 'time' p Time.at(1456466229973 / 1000, (1456466229973 % 1000) * 1000) 输出 2016-02-26 13:57:09 +080
用户1154259
2018/01/17
1.8K0
图解BiDAF中的单词嵌入、字符嵌入和上下文嵌入(附链接)
BiDAF(Bi-Directional Attention Flow,双向注意力流)是一种常用的问答任务机器学习模型,本文演示了BiDAF是如何使用三种嵌入机制将单词转化为向量形式的。
昱良
2019/10/21
1.8K0
图解BiDAF中的单词嵌入、字符嵌入和上下文嵌入(附链接)
Cpp程序的编译过程
前言 首先gcc与GCC要区分对待,GCC原名为GNU C Compiler,是一个C编译器的代号,但是后来不断地扩展,开始支持很多语言,GCC也就变成了编译器家族GNU Compiler Colle
yifei_
2022/11/14
1K0
Cpp程序的编译过程
点击加载更多

相似问题

cpp简单线程程序在退出时崩溃

13

cpp中的多线程难题

11

线程创建CPP

10

cpp中的线程出现错误。

11

线程中的Ruby线程

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文