首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YARV阵列的push/pop方法线程安全吗?

YARV阵列的push/pop方法线程安全吗?
EN

Stack Overflow用户
提问于 2018-08-13 19:20:17
回答 1查看 328关注 0票数 3

假设我有两个(生产者,消费者) YARV线程(TpTc)共享一个Array q - Tp推送到q,而Tc则从中弹出。如果执行推送和弹出的顺序不重要,那么代码在没有任何同步机制的情况下工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-13 19:27:07

在大多数情况下,访问数组在MRI/YARV中是线程安全的(而且只有在那里),因为它的全局解释器锁(GIL),因此大部分是偶然的。

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

话虽如此,Ruby为线程间通信提供了一个不同的原语,这恰好是MRI/VARV中唯一显式线程安全的类:队列。它支持以线程安全的方式推送和弹出对象.

以Ruby文档中的示例为例:

代码语言:javascript
复制
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

还有一个名为并发红宝石的维护良好的项目,它为跨线程的并发编程提供了许多强大的原语。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51829201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档