首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby线程介绍问题

Ruby线程介绍问题
EN

Stack Overflow用户
提问于 2015-01-04 20:20:11
回答 1查看 663关注 0票数 4

在过去的几天里,我一直在学习Ruby,并且遇到了一些关于线程实现的问题。我以前用其他语言(主要是Java和C)编程,但我仍然不知道问题出在哪里。我在UbuntuServer14.10上运行ruby2.1.2p95。所讨论的代码来自于兰斯利先生的“谦逊的小红宝石书”:

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

产出应是:

代码语言:javascript
运行
复制
Ahoy! Can I be dropping the anchor sir?
CAPTAIN: Aye, laddy!
Aye sir, dropping anchor!

但是,我收到了以下连接和死锁错误:

代码语言:javascript
运行
复制
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版本是否发生了一些变化,认为这些例子已经过时了?谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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),我得到了两个结果,有时它可以工作,我看到:

代码语言:javascript
运行
复制
Ahoy! Can I be dropping the anchor sir?
CAPTAIN: Aye, laddy!
Aye sir, dropping anchor!

其他情况下,它在以下方面失败:

代码语言:javascript
运行
复制
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>'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27769922

复制
相关文章

相似问题

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