锁定老帖子 主题:Ruby多线程
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-10-24
Java.Eye管理員 写道 我运行的结果永远是20000,20000,ruby 1.9.2p0
很明显,你机器的性能比较好,在一个时间片内就把2w次加法做完了。你找个上网本试一下,结果就不同了。 |
|
返回顶楼 | |
发表时间:2010-10-25
下了狠心进去看看,没想到遭遇到空方法
Thread类中的代码: def self.new(*args) #This is a stub, used for indexing end 算了,暂且放下,现在还没到那水平... |
|
返回顶楼 | |
发表时间:2010-10-27
require 'monitor' |
|
返回顶楼 | |
发表时间:2010-10-27
Ruby 1.8.x使用的绿色线程,调度应该是Ruby解释器自己实现的,而Ruby1.9使用系统线程,调度应该是操作系统负责吧。
|
|
返回顶楼 | |
发表时间: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之间。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2010-10-27
14060
20000 |
|
返回顶楼 | |