首页 > 解决方案 > 如何获取值,谁先返回了其中一个线程

问题描述

我需要处理谁首先nil从其中一个线程返回值并杀死其他线程。
例如我有这个代码:

需要“基准”
a = 无
提出“我需要 1 秒钟的时间进行测试……”
result_time = Benchmark.measure {
    虽然是真的
      t1 = Thread.new { a = nil 除非 a } 除非 t1
      t2 = Thread.new { a = 1 除非 a; 睡眠 1 } 除非 t2
      t3 = Thread.new { a = 1 除非 a; 睡眠 2 } 除非 t3
      t1.join
      t2.join
      t3.join
      如果!a.nil?
        t1.kill 如果 t1
        t2.kill 如果 t2
        t3.kill 如果 t3
        休息
      结尾
    结尾
}。真实的

如果结果时间 >= 2.0
  提出“糟糕。超过 1 秒。result_time: #{result_time}”
别的
  “酷。不到 2 秒。”
结尾

此代码返回:

我需要 1 秒的时间进行测试...
坏的。超过 1 秒。结果时间:2.00074989994755
所以我想要这个测试 1 秒(不是 2 秒)。请帮助并为我的英语感到抱歉:)

标签: rubymultithreading

解决方案


我只是删除t1.join, t2.join and t3.join...因为方法.join停止主线程。但不知道为什么结果时间 >= 1 和 <=2。我认为睡眠指令没有被执行,因为主线程只是a = 1while循环中杀死第二个而不等待睡眠指令。最终代码:

需要“基准”
a = 无
提出“我需要 1 秒进行测试”
result_time = Benchmark.measure {
    虽然是真的
      t1 = Thread.new { a = nil 除非 a } 除非 t1
      t2 = Thread.new { a = 1 除非 a; 睡眠 1 } 除非 t2
      t3 = Thread.new { a = 2 除非 a; 睡眠 2 } 除非 t3
      如果!a.nil?
        t1.kill 如果 t1
        t2.kill 如果 t2
        t3.kill 如果 t3
        休息
      结尾
    结尾
}。真实的

如果结果时间 >= 2.0 提出“糟糕。超过 1 秒。result_time: #{result_time}。a: #{a}” 别的 puts "酷。不到 2 秒。result_time: #{result_time}。a: #{a}" 结尾

还给我:
我需要 1 秒进行测试
凉爽的。不到2秒。结果时间:0.001799600024241954。一个:1


推荐阅读