如何实现当任一数组生成完成时,终止两个数组的后续数字生成?
实现数组生成的互相终止逻辑
这是个挺有意思的同步问题!原代码里两个数组是串行生成的——先跑完array_1的所有循环,才会开始生成array_2,自然没法做到一个完成就终止另一个。要实现需求,我们需要让两个数组的生成过程并行执行,同时共享一个线程安全的终止信号,让它们能互相感知对方的状态。
线程安全的实现方案
下面是推荐的严谨实现,用自定义的Terminator类来管理终止信号,避免多线程环境下的竞态问题:
def random_number # 简化原逻辑的写法 rand(2) == 1 ? rand(1..25) : 0 end # 线程安全的终止信号管理器 class Terminator def initialize @terminated = false @mutex = Mutex.new # 保证多线程下修改标志的原子性 end # 触发终止信号 def terminate! @mutex.synchronize { @terminated = true } end # 检查是否已终止 def terminated? @mutex.synchronize { @terminated } end end def random_array(terminator) array = [99] # 循环终止条件:要么自己的最后元素≤0,要么另一个数组已经触发终止信号 until array.last <= 0 || terminator.terminated? next_num = array.last - random_number array << next_num end # 自己完成后,立刻触发终止信号(避免重复触发) terminator.terminate! unless terminator.terminated? puts "Generated array: #{array.inspect}" array end # 初始化终止器 terminator = Terminator.new # 启动两个并行线程生成数组 thread1 = Thread.new { random_array(terminator) } thread2 = Thread.new { random_array(terminator) } # 等待两个线程执行完毕 thread1.join thread2.join # 获取线程生成的数组结果 array_1 = thread1.value array_2 = thread2.value
关键逻辑说明
- 并行执行:用
Thread.new让两个数组的生成过程同时运行,这样它们才能实时感知对方的状态。 - 线程安全的终止信号:
Terminator类用Mutex保证多线程下修改和读取终止标志的原子性,避免多个线程同时操作导致的状态不一致。 - 双终止条件:每个数组的循环都会检查两个条件——自己是否完成,或者另一个数组是否已经触发终止信号,只要满足一个就停止循环。
简化版实现(适合简单场景)
如果你的场景不需要严格的线程安全(比如只是快速测试),可以用全局变量简化实现,但要注意这种方式在极端情况下可能存在竞态问题(不过不影响最终功能):
def random_number rand(2) == 1 ? rand(1..25) : 0 end # 全局终止标志 $terminated = false def random_array array = [99] until array.last <= 0 || $terminated array << (array.last - random_number) end # 触发终止信号 $terminated = true unless $terminated puts array.inspect array end # 并行生成数组 thread1 = Thread.new { random_array } thread2 = Thread.new { random_array } thread1.join thread2.join array_1 = thread1.value array_2 = thread2.value
这样就能实现你要的效果:只要其中一个数组的最后元素≤0,另一个数组会在下一次循环检查时立刻停止生成。
内容的提问来源于stack exchange,提问作者gingervitiis
相关产品推荐
相关产品推荐

