因为CRuby(MRI)本身不支持原生多线程,所以想试一下其他ruby解释器实现对原生多线程的支持.于是安装rubinius折腾一下:)
在rubinius官网下载2.4.1源代码,然后驾轻就熟首先bundle,然后./configure一切正常,在rake最后关头出现错误,提示rubinius内部文件夹中若干文件找不到;奇怪的是再次执行rake后,还是报错,但是文件夹中出现了上次未找到的文件,进去看了一下貌似内容不太对,只有Gemfile和一些README之类的文件,并没有源代码之类的文件.多次执行rake,发现文件夹中文件越来越多,但rake总是不成功.
开始怀疑是源代码过旧,于是从github中clone最新版本2.5.x,下载失败几次后终于成功鸟,一百多兆,解压缩后大了一倍多;然后按部就班,发现在执行./configure时下载了很多gem,于是抱有希望鸟...可是rake时还是报错,错误相同.照理不应该啊!不可能再是源代码的问题,多半是笨猫系统的问题!
静下心来,错误最后的一些细节引起了本猫的注意:隐约一些utf8转换神马ascii8失败之类的词眼云云飘来...忽然联想到:难道是PATH中有中文的原因吗?果不其然,fk!换为全english的path后一切清净了;编译时间不短也不长,最后还有若干UnitTest需要运行测试...剩下的就简单鸟:rake install,再错,加权限后ok!
下面上测试代码:
#!/usr/bin/ruby
$x = 0
Thread_proc = ->{i=0;($x+=1;i+=1) while(i<10000)}
def make_t(blk)
Thread.new(&blk)
end
t0 = make_t(Thread_proc)
t1 = make_t(Thread_proc)
t0.join
t1.join
puts "$x last is #{$x}"
在MRI和rbx分别5次结果如下:
MRI:
linuxidc@linuxidc:~/src/ruby_src$ ruby a.rb
$x last is 20000
linuxidc@linuxidc:~/src/ruby_src$ ruby a.rb
$x last is 20000
linuxidc@linuxidc:~/src/ruby_src$ ruby a.rb
$x last is 20000
linuxidc@linuxidc:~/src/ruby_src$ ruby a.rb
$x last is 20000
linuxidc@linuxidc:~/src/ruby_src$ ruby a.rb
$x last is 20000
rbx:
linuxidc@linuxidc:~/src/ruby_src$ rbx a.rb
$x last is 17234
linuxidc@linuxidc:~/src/ruby_src$ rbx a.rb
$x last is 17845
linuxidc@linuxidc:~/src/ruby_src$ rbx a.rb
$x last is 11626
linuxidc@linuxidc:~/src/ruby_src$ rbx a.rb
$x last is 14554
linuxidc@linuxidc:~/src/ruby_src$ rbx a.rb
$x last is 16098
结论很简单,印证了本篇的主题。