gpt4 book ai didi

ruby - join 如何在 ruby​​ 线程上工作?

转载 作者:行者123 更新时间:2023-12-03 12:56:07 26 4
gpt4 key购买 nike

调用 join在要加入的线程尚未完成时,线程会阻塞父线程。为了检查这一点,我创建了以下代码:

threads = []
3.times do |i|
threads << Thread.new do
3.times do |j|
puts "Thread #{i} says #{j} (#{Thread.current})"
sleep 0.1
end
end
end

#threads.map(&:join)
threads[0].join
puts "After first join"
threads[1].join
puts "After second join"
threads[2].join
puts "Last line of main thread"

运行这样的代码给出了这个输出:
Thread 0 says 0 (#<Thread:0x007fdceb0b8568>)
Thread 2 says 0 (#<Thread:0x007fdce982bb08>)
Thread 1 says 0 (#<Thread:0x007fdceb0b8450>)
Thread 0 says 1 (#<Thread:0x007fdceb0b8568>)
Thread 1 says 1 (#<Thread:0x007fdceb0b8450>)
Thread 2 says 1 (#<Thread:0x007fdce982bb08>)
Thread 1 says 2 (#<Thread:0x007fdceb0b8450>)
Thread 2 says 2 (#<Thread:0x007fdce982bb08>)
Thread 0 says 2 (#<Thread:0x007fdceb0b8568>)
After first join
After second join
Last line of main thread

为什么 ruby​​ 打印 After first join在线程的指令之后虽然指令 threads[1].join是在这条打印指令之后执行的吗?

最佳答案

因为puts "Thread #{i} says #{j} (#{Thread.current})" threads[1] 的部分(或全部)之前完成puts "After first join" .事实threads[1].joinputs "After first join" 之后执行不影响结果。

你似乎有两点逻辑缺陷。应按以下方式更正:

  • puts "Thread #{i} says #{j} (#{Thread.current})"threads[1]之前做过 puts "After first join"主线程,那么是否整个threads[1]之前做过 puts "After first join"开始是无关紧要的。
  • threads[1]之前有机会做puts "After first join"主线程的执行。 threads[1].join仅在其他情况下显示效果。

  • 可能会发生的事情(实际上确实发生过)是,因为您有 threads[0].join在任何之前 puts方法调用,主线程一直休眠到 threads[0]完了。从 threads[1] , 和 threads[2] threads[0] 后立即开始,三个子线程几乎同时完成。换句话说,如果你为 threads[0] 等待足够的时间完成,那么很可能其他两个线程也将完成。

    关于ruby - join 如何在 ruby​​ 线程上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17762927/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com