假设我有两个(生产者,消费者) YARV线程(Tp,Tc)共享一个Array q - Tp推送到q,而Tc则从中弹出。如果执行推送和弹出的顺序不重要,那么代码在没有任何同步机制的情况下工作吗?
发布于 2018-08-13 19:27:07
在大多数情况下,访问数组在MRI/YARV中是线程安全的(而且只有在那里),因为它的全局解释器锁(GIL),因此大部分是偶然的。
您仍然需要确保每次只执行一个操作,并避免读/写构造。在Rubinius或JRuby等其他Ruby实现中,数组显然不是线程安全的。
话虽如此,Ruby为线程间通信提供了一个不同的原语,这恰好是MRI/VARV中唯一显式线程安全的类:队列。它支持以线程安全的方式推送和弹出对象.
以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还有一个名为并发红宝石的维护良好的项目,它为跨线程的并发编程提供了许多强大的原语。
https://stackoverflow.com/questions/51829201
复制相似问题