gpt4 book ai didi

ruby - ruby 队列不是线程安全的,为什么队列不同步?

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:56 32 4
gpt4 key购买 nike

我正在尝试创建多个线程并在数据结构中返回结果,并且我读到 Queue 是线程安全的,但是当我运行代码时它没有产生预期的结果。

require 'thread'

class ThreadsTest
queue = Queue.new
threads = []
for i in 1..10
threads << Thread.new do
queue << i
end
end

threads.each { |t| t.join }

for i in 1..10
puts queue.pop()
end
end

代码打印:(总是有点不同)

4
4
4
4
10
10
10
10
10
10

我期待的是数字 1 到 10。

我已尝试手动同步它但无济于事:

  mutex = Mutex.new
for i in 1..10
threads << Thread.new do
mutex.synchronize do
queue << i
end
end
end

我错过了什么?

最佳答案

Queue 是线程安全的,但您的代码不是。就像变量 queue 一样,变量 i 在线程之间共享,因此线程在循环中更改时引用同一个变量。

要修复它,您可以将变量传递给 Thread.new,这会将它变成一个线程局部变量:

threads << Thread.new(i) do |i|
queue << i
end

block 内的 i 隐藏了外部的 i,因为它们具有相同的名称。如果需要,您可以使用其他名称(例如 |thread_i|)。

输出:

3
2
10
4
5
6
7
8
9
1

关于ruby - ruby 队列不是线程安全的,为什么队列不同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45611539/

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