You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现当任一数组生成完成时,终止两个数组的后续数字生成?

实现数组生成的互相终止逻辑

这是个挺有意思的同步问题!原代码里两个数组是串行生成的——先跑完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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:47:10