相同代码的两个版本未提供相同结果

纳比

我试图实现一个简单的超时类来处理不同请求的超时。

这是第一个版本:

class MyTimer
  def handleTimeout mHash, k
    while mHash[k] > 0 do
        mHash[k] -=1
        sleep 1
        puts "#{k} : #{mHash[k]}"
    end
  end
end

MAX = 3

timeout = Hash.new
timeout[1] = 41
timeout[2] = 5
timeout[3] = 14

t1 = MyTimer.new 
t2 = MyTimer.new 
t3 = MyTimer.new 

first = Thread.new do
    t1.handleTimeout(timeout,1)
end

second = Thread.new do 
    t2.handleTimeout(timeout,2)
end

third = Thread.new do 
    t3.handleTimeout(timeout,3)
end

first.join
second.join
third.join

这似乎工作正常。所有的超时都是彼此独立的。萤幕撷取画面

但是,该代码的第二个版本会产生不同的结果:

class MyTimer
  def handleTimeout mHash, k
    while mHash[k] > 0 do
        mHash[k] -=1
        sleep 1
        puts "#{k} : #{mHash[k]}"
    end
  end
end

MAX = 3

timeout = Hash.new
timers = Array.new(MAX+1)
threads = Array.new(MAX+1)


for i in 0..MAX do
  timeout[i] = rand(40)
  # To see timeout value
  puts "#{i} : #{timeout[i]}"
end

sleep 1

for i in 0..MAX do
  timers[i] = MyTimer.new
  threads[i] = Thread.new do
    timers[i].handleTimeout( timeout, i)
  end
end


for i in 0..MAX do
  threads[i].join
end

萤幕撷取画面

为什么会这样呢?

如何使用数组实现此功能?

有没有更好的方法来实现相同的功能?

魔杖制造者

在使用创建线程的循环中Thread.new,该变量imain线程(正在创建线程的地方)和所创建的线程之间共享因此,iseeby by的值handleTimeout不一致,您将获得不同的结果。

您可以通过在方法中添加调试语句来验证这一点:

 #...
 def handleTimeout mHash, k
    puts "Handle timeout called for #{mHash} and #{k}"
    #...
 end
 #...

要解决此问题,您需要使用以下代码。在这里,参数被传递给Thread.new块变量,然后使用块变量进行访问。

for i in 0..MAX do
  timers[i] = MyTimer.new
  threads[i] = Thread.new(timeout, i) do |a, b|
    timers[i].handleTimeout(a, b)
  end
end

您何时需要将参数传递给Thread.new?中介绍了有关此问题的更多信息还有这篇文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数的两个版本未产生相同的结果

来自分类Dev

为什么这两个代码给出的结果相同?

来自分类Dev

jQuery两个函数,相同的结果,相同的元素

来自分类Dev

返回相同结果的两个相同NSDate的比较

来自分类Dev

为什么这两个版本的高阶函数没有给出相同的结果?

来自分类Dev

Java:对两个不同版本的依赖类使用相同的代码

来自分类Dev

Bootstrap:在同一浏览器中使用相同代码的两个文件结果不同

来自分类Dev

为什么这两个代码片段会产生相同的结果?

来自分类Dev

为什么这两个代码片段会产生相同的结果?

来自分类Dev

安装了两个python(相同版本)

来自分类Dev

相同功能的两个版本(用于内联或constexpr)

来自分类Dev

安装了两个python(相同版本)

来自分类Dev

相同功能的两个版本(用于内联或constexpr)

来自分类Dev

如何保证两个事务的数据版本相同?

来自分类Dev

提供相同渲染器的两个JSF库

来自分类Dev

如何给两个不同的类提供相同的接口?

来自分类Dev

两个相同的公式产生不同的结果

来自分类Dev

编写两个不同的SharedPreference并获得相同的结果

来自分类Dev

如何模拟两个相同的mongo集合,但结果不同?

来自分类Dev

两个相同的公式产生不同的结果

来自分类Dev

MatLab:相同的功能获得两个不同的结果

来自分类Dev

SQL:如何组合两个查询并获得相同的结果?

来自分类Dev

两个不同的终端行命令 - 结果相同

来自分类Dev

确定两个未排序的数组是否相同?

来自分类Dev

证明两个代码块在功能上是相同的?

来自分类Dev

具有相同代码库的两个项目

来自分类Dev

两个具有相同代码的程序:浮点溢出

来自分类Dev

两个不同的Private Sub语句相同的代码

来自分类Dev

同时使用两个AVAssetWriters创建相同视频输入的两个版本

Related 相关文章

  1. 1

    函数的两个版本未产生相同的结果

  2. 2

    为什么这两个代码给出的结果相同?

  3. 3

    jQuery两个函数,相同的结果,相同的元素

  4. 4

    返回相同结果的两个相同NSDate的比较

  5. 5

    为什么这两个版本的高阶函数没有给出相同的结果?

  6. 6

    Java:对两个不同版本的依赖类使用相同的代码

  7. 7

    Bootstrap:在同一浏览器中使用相同代码的两个文件结果不同

  8. 8

    为什么这两个代码片段会产生相同的结果?

  9. 9

    为什么这两个代码片段会产生相同的结果?

  10. 10

    安装了两个python(相同版本)

  11. 11

    相同功能的两个版本(用于内联或constexpr)

  12. 12

    安装了两个python(相同版本)

  13. 13

    相同功能的两个版本(用于内联或constexpr)

  14. 14

    如何保证两个事务的数据版本相同?

  15. 15

    提供相同渲染器的两个JSF库

  16. 16

    如何给两个不同的类提供相同的接口?

  17. 17

    两个相同的公式产生不同的结果

  18. 18

    编写两个不同的SharedPreference并获得相同的结果

  19. 19

    如何模拟两个相同的mongo集合,但结果不同?

  20. 20

    两个相同的公式产生不同的结果

  21. 21

    MatLab:相同的功能获得两个不同的结果

  22. 22

    SQL:如何组合两个查询并获得相同的结果?

  23. 23

    两个不同的终端行命令 - 结果相同

  24. 24

    确定两个未排序的数组是否相同?

  25. 25

    证明两个代码块在功能上是相同的?

  26. 26

    具有相同代码库的两个项目

  27. 27

    两个具有相同代码的程序:浮点溢出

  28. 28

    两个不同的Private Sub语句相同的代码

  29. 29

    同时使用两个AVAssetWriters创建相同视频输入的两个版本

热门标签

归档