我有一个文件test.rb
,其中包含以下代码,该文件从不同线程递增一个共享变量:
require 'thwait'
threads_number = ARGV.first.to_i
incr_number = ARGV.last.to_i
start = Time.now
sum = 0
create_thread = proc do
Thread.new { incr_number.times { sum += 1 } }
end
threads = threads_number.times.map { create_thread.call }
ThreadsWait.all_waits(*threads)
p Time.now - start, sum
我在具有不同红宝石版本的同一台计算机上尝试了此代码,并得到以下结果:
红宝石2.5.1p57(2018-03-29修订版63029)[x86_64-linux]
$ ruby multithreading.rb 4 100000
0.022668827
400000
jruby 9.2.4.1(2.5.0)2018-11-28 f487d1e OpenJDK 64位服务器VM 25.181-b13 on 1.8.0_181-8u181-b13-2〜deb9u1-b13 + jit [linux-x86_64 ]
$ ruby multithreading.rb 4 100000
0.095028
241229
我知道ruby 2.5总是会由于GIL而给400000
作为总和,而由于多线程,jruby
的结果可能会有所不同。
Thread#join
和ThreadsWait.all_waits
有什么区别?