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

Ruby多线程

浏览 10476 次
锁定老帖子 主题:Ruby多线程
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-24  
Java.Eye管理員 写道
我运行的结果永远是20000,20000,ruby 1.9.2p0

很明显,你机器的性能比较好,在一个时间片内就把2w次加法做完了。你找个上网本试一下,结果就不同了。
0 请登录后投票
   发表时间:2010-10-25  
下了狠心进去看看,没想到遭遇到空方法
Thread类中的代码:
def self.new(*args)
    #This is a stub, used for indexing
end
算了,暂且放下,现在还没到那水平...
0 请登录后投票
   发表时间:2010-10-27  
require 'monitor'
0 请登录后投票
   发表时间:2010-10-27  
Ruby 1.8.x使用的绿色线程,调度应该是Ruby解释器自己实现的,而Ruby1.9使用系统线程,调度应该是操作系统负责吧。
0 请登录后投票
   发表时间:2010-10-27  
# class Counter 
#    attr_reader :count 
#    def initialize 
#      @count = 0 
#      super 
#    end 
#    def tick3 
#      @count += 1 
#    end 
#  end 


@count += 1  这句,等效于

tmp = @count+1
@count = tmp

在没有使用synchronize关键字的情况下。 两个线程同时访问该代码块,会出现一下情况:

假定@count现在等于0
thread1: tmp = @count+1 #@count=>0
thread2: tmp = @count+1 #@count=>0
thread1: @count = tmp #@count=>1
thread2: @count = tmp #@count=>1


也就是说, 如果所有的进程都按照这个顺序进入该代码块, 计算出的count应当是1000

所以, 可以预测, 最终的count结果应该在1000~2000之间。

推而广之, 如果有N个进程,每个进程执行1000此,  那么count的范围应该在1000~N*1000之间。
0 请登录后投票
   发表时间:2010-10-27   最后修改:2010-10-27
在这两句之间稍稍加上一个大运算量( 1000.times{|i|Math::PI*rand(i)} ), 立即跑到1000
tmp = @count+1
@count = tmp

#### 以下代码count值为1000############################
class Counter
   attr_reader :count 
   def initialize 
     @count = 0 
     super 
   end 
   def _tick3 
     @count += 1 
   end 
   def tick3 
     #synchronize do 
       tmp = @count + 1
1000.times{|i|Math::PI*rand(i)}
@count = tmp
     #end 
   end 
end 
c = Counter.new 
t1 = Thread.new { 1000.times { c.tick3 } } 
t2 = Thread.new { 1000.times { c.tick3 } } 
t1.join 
t2.join 
puts c.count #1000
0 请登录后投票
   发表时间:2010-10-27  
14060
20000
0 请登录后投票
论坛首页 编程语言技术版

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