在过去的几天里,我一直在学习Ruby,并且遇到了一些关于线程实现的问题。我以前用其他语言(主要是Java和C)编程,但我仍然不知道问题出在哪里。我在UbuntuServer14.10上运行ruby2.1.2p95。所讨论的代码来自于兰斯利先生的“谦逊的小红宝石书”:
mate = Thread.new do
puts "Ahoy! Can I be dropping the anchor sir?"
Thread.stop
puts "Aye sir, dropping anchor!"
end
Thread.pass
puts "CAPTAIN: Aye, laddy!"
mate.run
mate.join产出应是:
Ahoy! Can I be dropping the anchor sir?
CAPTAIN: Aye, laddy!
Aye sir, dropping anchor!但是,我收到了以下连接和死锁错误:
CAPTAIN: Aye, laddy!
Ahoy! Can I be dropping the anchor sir?
ex2.rb:12:in `join': No live threads left. Deadlock? (fatal)
from ex2.rb:12:in `<main>'我在其他资源中的其他线程示例中也遇到了错误,并且尝试在其他Ubuntu机器上运行这些示例,并尝试使用Ruby2.2。我错过了一个明显的概念吗?最近的Ruby版本是否发生了一些变化,认为这些例子已经过时了?谢谢你的帮助!
发布于 2015-01-04 20:52:09
最近的Ruby版本是否发生了一些变化,认为这些例子已经过时了?
是。看上去这本书是为Ruby 1.8编写的,它使用了线程。Ruby1.9继续使用本机线程(在这些线程是由操作系统调度的)。
比较Ruby1.8.7中的的文档
调用线程调度程序将执行传递给另一个线程。
在Ruby2.1.2(您正在使用的版本)中,此方法文档化如下所示:
给线程调度程序一个将执行传递给另一个线程的提示。正在运行的线程可能切换也可能不切换,这取决于操作系统和处理器。
因此,在当前版本中,调度并不像Ruby1.8.7那样具有确定性,操作系统可以忽略对Thread.pass的调用,首先运行主线程,这就导致了问题的出现。
在我的机器上运行这个脚本(MacOS10.9,Ruby2.2.0),我得到了两个结果,有时它可以工作,我看到:
Ahoy! Can I be dropping the anchor sir?
CAPTAIN: Aye, laddy!
Aye sir, dropping anchor!其他情况下,它在以下方面失败:
CAPTAIN: Aye, laddy!
Ahoy! Can I be dropping the anchor sir?
capt-thread.rb:12:in `join': No live threads left. Deadlock? (fatal)
from capt-thread.rb:12:in `<main>'https://stackoverflow.com/questions/27769922
复制相似问题