论坛首页 编程语言技术论坛

ruby 中线程问题探讨

浏览 2295 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-27  
t = Thread.new do
  i=0
  while true
       #sleep 1

       puts "printing a line, #{i.to_s}"
       i+=1
       #sleep 1
     end
  end

gets
t.exit
puts "exiting"


这个例子来自http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229801
就是在windows下,加上sleep就不会在dow界面上打印 printing a line,即使把sleep去掉,
好像在只能写到80来行就停止了。
  其中有人解答说是ruby采用one-click install的将使之io和线程不能工作。而在linux下
和macos下可以,是这样的吗?
  希望资深者解释一二。
   发表时间:2008-03-31  
不是sleep的问题
gets或者t.exit造成的问题

建议改成
gets 
#t.exit 
puts "exiting"
t.join
看看
即,注释t.exit,并补充t.join

0 请登录后投票
   发表时间:2008-03-31  
又试了另外的例子,即在gets前加入sleep 10
sleep 10 
gets 
t.exit 
puts "exiting"
t.join
可以解决该问题。
我估计gets直接把输出io给block掉了,如果t线程加上sleep 1,造成t线程来不及输出printing a line, #{i.to_s}。

线程main的gets和线程puts都在争夺输出io...
0 请登录后投票
   发表时间:2008-03-31  
很少见到人用ruby的thread.

ruby不是用的os thread,而是自己管理的'green' thread.这种办法在写库函数的非常麻烦,所有可能阻塞的地方都要自己做检查,看是否需要context switch。如果哪处遗漏了就是deadlock.



0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics