在Ruby中,我习惯于看到puts
总是在打印字符串之前在其后面附加一个换行符。
在Ruby中使用多线程,包括使用JRuby运行它时,我注意到一些奇怪的行为。有时,两行会打印在同一行上,而不是像我预期的那样打印在单独的行上。在我第一次尝试时,我的脚本使用的是并发ruby中的Semaphore
,因为我正在测试并发和并行模式。我使用信号量一次只允许启动配置数量的线程。这种情况发生的可能性约为20%。
为了为Stack Overflow创建最小的复制,我去掉了并发Ruby并创建了我的程序的一个较小版本,它只创建立即运行的线程,而不需要首先将代码块存储在pros中,也不使用信号量。在这个新程序中,这个问题100%都会发生(至少到目前为止我已经尝试运行了多少次)。
我知道,对于多线程,每次打印两行的顺序可能不同,这取决于哪个线程首先运行。但我没有想到,有时应该在每个打印的字符串末尾的换行符(因为我用puts
打印它们)有时会不在那里。
计划:
def work(n)
puts "Started unit of work ##{n}."
i = 0
100000000.times { i += 1 }
puts "Finished unit of work ##{n}."
end
threads = []
2.times do |i|
thread = Thread.new do
work(i + 1)
end
threads << thread
end
threads.each do |t|
t.join
end
puts "nEnd."
产出:
Started unit of work #1.Started unit of work #2.
Finished unit of work #2.
Finished unit of work #1.
End.
注意输出如何包括Started unit of work #1.Started unit of work #2.
而不是Started unit of work #1.\nStarted unit of work #2.
。还要注意,对于每个线程中对puts
的第二次调用,这个问题不会发生。不出所料,这些都在不同的线路上。
每次我用JRuby运行Ruby脚本时,这个输出都是一致的。我无法运行它在Started unit of work #1.
或Started unit of work #2.
之后打印换行符。
系统详细信息:
> jruby --version
jruby 9.3.8.0 (2.6.8) 2022-09-13 98d69c9461 OpenJDK 64-Bit Server VM 19+36-2238 on 19+36-2238 +jit [x86_64-linux]
> java --version
openjdk 19 2022-09-20
OpenJDK Runtime Environment (build 19+36-2238)
OpenJDK 64-Bit Server VM (build 19+36-2238, mixed mode, sharing)
> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Codename: jammy
暂无答案!
目前还没有任何答案,快来回答吧!