我们正在为我们的嵌入式ruby测试线程协作。我们有一个C ruby扩展,它实现了以下方法
1. longRunningMethod()
2. shortRunningMethod().下面是检查线程协作的代码
//文件test.rb
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,谢谢。
发布于 2011-09-06 14:45:08
Ruby 1.8中的线程不使用原生OS线程机制。所有Ruby线程实际上都在一个本地线程中运行(没有并行执行)。
您的C方法是原子的,所以线程调度程序在切换Ruby线程之前一直等到它们返回。这就是为什么一旦它在shortRunningMethod之前开始做longRunningMethod,它就不会做其他的事情,直到它完成。你正在经历所谓的“线程饥饿”。
避免这种情况的一种方法是以这种方式实现您的longRunningMethod,以便它定期调用sleep本身。
发布于 2011-09-06 14:45:52
线程一创建就会自动启动吗?在Java语言中,必须显式调用t1.start()才能启动线程。也许在Ruby中也是如此。
t1.join可以有额外的功能,它可以检查线程是否已经启动,如果还没有启动,就启动它。
https://stackoverflow.com/questions/7315793
复制相似问题