2011-09-06 47 views
1

我們正在測試我們的嵌入式ruby的線程協作。我們有一個C Ruby擴展implementented以下方法爲什麼sleep語句爲我們的嵌入式ruby產生這個結果?

1. longRunningMethod() 
2. shortRunningMethod(). 

下面是檢查線程合作

//文件 test.rb

require 'mymodule' 

$a = 0; 
obj = MyModule::MyClass.new 
t1 = Thread.new{$a = obj.veryLongRunningOperation(); puts "doneLong"} 
sleep 1 
$a = obj.shortOperation() 
puts "doneShort" 
t1.join 

我們已經確保了一個代碼longRunningMethod使用嵌套循環執行需要超過1秒(5秒)的執行時間 根據我們的理解,首先應完成shortRunningMethod,然後再執行longRunningMethod。

但是我們只在沒有任何睡眠命令時才觀察到這一點。 但是當我們介紹「睡眠1」的聲明。 longRunningMethod首先執行然後執行shortRunningMethod

任何人都會給我們關於爲什麼sleep語句產生這個結果的指針?

[我們正在使用紅寶石1.8.6]在此先感謝。

回答

7

Ruby 1.8中的線程不使用本地OS線程機制。所有的Ruby線程實際上都在一個本地線程中運行(不能並行執行)。

你的C方法是原子的,所以線程調度程序在切換Ruby線程之前一直等到它們返回。這就是爲什麼一旦它開始做longRunningMethod之前,它得到shortRunningMethod它沒有做任何其他事情,直到它完成。你正在經歷所謂的「線程匱乏」。避免它

的一種方式,是實現你的longRunningMethod以這樣的方式,使得它定期調用sleep本身。

+0

非常感謝您的答覆。你能告訴我什麼是原子方法,並且c有一個原子方法(我發現目標c有原子方法)? – Prajkata

+0

原子的一旦開始執行,Ruby無法停止或暫停它。它需要在控制權返回到Ruby之前全部執行。 – Mchl

+0

我有一個問題,當我們刪除睡眠函數調用時,爲什麼我們得到預期的結果?(shortRunningMethod先完成然後再運行longRunningMethod。)。 – Prajkata

0

線程創建後是否自動啓動?在Java中,必須顯式調用t1.start()才能啓動線程。也許它在Ruby中是一樣的。

t1.join可能具有額外的功能,它會調查線程是否已經啓動,如果沒有啓動它。

相關問題