gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:56:51 27 4
gpt4 key购买 nike

假设我有一对(生产者,消费者)YARV 线程(Tp,Tc)共享一个Array q - Tp 推送到 qTc 从中弹出。如果压入和弹出的执行顺序不重要,代码是否可以在没有任何同步机制的情况下工作?

最佳答案

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

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

话虽如此,Ruby 为线程间通信提供了不同的原语,巧合的是 MRI/VARV 中唯一明确线程安全的类: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它为跨线程的并发编程提供了许多强大的原语。

关于ruby - YARV 数组的 push/pop 方法是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829201/

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