首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sleep语句会为我们的嵌入式ruby产生这个结果?

为什么sleep语句会为我们的嵌入式ruby产生这个结果?
EN

Stack Overflow用户
提问于 2011-09-06 14:37:14
回答 2查看 126关注 0票数 1

我们正在为我们的嵌入式ruby测试线程协作。我们有一个C ruby扩展,它实现了以下方法

代码语言:javascript
复制
1. longRunningMethod()
2. shortRunningMethod().

下面是检查线程协作的代码

//文件test.rb

代码语言:javascript
复制
require 'mymodule'

$a = 0;
obj = MyModule::MyClass.new
t1 = Thread.new{$a = obj.veryLongRunningOperation(); puts "doneLong"}
sleep 1
$a = obj.shortOperation()
puts "doneShort"
t1.join

我们已经确保使用嵌套的for循环执行longRunningMethod的时间超过1秒(5秒)。根据我们的理解,应该先完成shortRunningMethod,然后完成longRunningMethod。

然而,我们只有在没有任何睡眠命令的情况下才观察到这一点。但是当我们引入“睡眠1”语句时。首先执行longRunningMethod,然后执行shortRunningMethod

有没有人会告诉我们为什么sleep语句会产生这个结果?

我们使用的是ruby 1.8.6,谢谢。

EN

回答 2

Stack Overflow用户

发布于 2011-09-06 14:45:08

Ruby 1.8中的线程不使用原生OS线程机制。所有Ruby线程实际上都在一个本地线程中运行(没有并行执行)。

您的C方法是原子的,所以线程调度程序在切换Ruby线程之前一直等到它们返回。这就是为什么一旦它在shortRunningMethod之前开始做longRunningMethod,它就不会做其他的事情,直到它完成。你正在经历所谓的“线程饥饿”。

避免这种情况的一种方法是以这种方式实现您的longRunningMethod,以便它定期调用sleep本身。

票数 7
EN

Stack Overflow用户

发布于 2011-09-06 14:45:52

线程一创建就会自动启动吗?在Java语言中,必须显式调用t1.start()才能启动线程。也许在Ruby中也是如此。

t1.join可以有额外的功能,它可以检查线程是否已经启动,如果还没有启动,就启动它。

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

https://stackoverflow.com/questions/7315793

复制
相关文章

相似问题

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