因為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
結論很簡單,印證了本篇的主題。
更多Ubuntu相關信息見Ubuntu 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=2