代码之家  ›  专栏  ›  技术社区  ›  bsam

YARV数组的push/pop方法是线程安全的吗?

  •  2
  • bsam  · 技术社区  · 6 年前

    假设我有一对(生产者,消费者)YARV线程( Tp , Tc )共享 Array q 总磷 推到 ,和 Tc公司 从里面跳出来。如果push和pops的执行顺序不重要,那么代码是否在没有任何同步机制的情况下工作?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Holger Just    6 年前

    由于其全局解释器锁(GIL),在MRI/YARV中访问数组在大多数情况下是线程安全的,因此大多数情况下是偶然的。

    您仍然需要确保每次只执行一个操作,并避免读/写构造。在Rubinius或JRuby等其他Ruby实现中,数组显然不是线程安全的。

    Queue . 它支持以线程安全的方式推送和弹出对象。

    以Ruby文档中的这个例子为例:

    queue = Queue.new
    
    producer = Thread.new do
      5.times do |i|
         sleep rand(i) # simulate expense
         queue << i
         puts "#{i} produced"
      end
    end
    
    consumer = Thread.new do
      5.times do |i|
         value = queue.pop
         sleep rand(i/2) # simulate expense
         puts "consumed #{value}"
      end
    end
    

    也有一个维护良好的项目叫做 concurrent-ruby