2017-09-03 77 views
4

我需要有多個線程,每個線程從同一個套接字或從 $ * IN;然而,似乎有錯誤,因爲每個人都試圖從相同的來源閱讀(我認爲)。解決這個問題的最好方法是什麼?謝謝 !!perl6線程讀取干擾

my $x = start { prompt("I am X: Enter x: "); } 
my $y = start { prompt("I am Y: Enter y: "); } 

await $x, $y; 
say $x; 
say $y; 

這裏是錯誤:

I am X: Enter x: I am Y: Enter y: Tried to get the result of a broken Promise 
    in block <unit> at zz.pl line 4 

Original exception: 
    Tried to read() from an IO handle outside its originating thread 
     in block at zz.pl line 1 

謝謝!

回答

4

在Rakudo最新開發快照,你的代碼實際工作未拋出我的系統上的任何異常...
但是,它仍然立即詢問這兩個值(I am X: Enter x: I am Y: Enter y:)。

爲了使第二prompt等到第一個完成後,您可以使用一個Lock

#--- Main code --- 

my $x = start { synchronized-prompt "I am X: Enter x: "; } 
my $y = start { synchronized-prompt "I am Y: Enter y: "; } 

await $x, $y; 
say $x.result; 
say $y.result; 


#--- Helper routines --- 

BEGIN my $prompt-lock = Lock.new; 

sub synchronized-prompt ($message) { 
    $prompt-lock.protect: { prompt $message; } 
} 

棘手的部分是,把鎖需要之前進行初始化線程開始使用它同時。這就是爲什麼我在程序的主線中調用synchronized-prompt子程序的以外的Lock.new。而不是在程序頂部執行,我使用BEGIN phaser,以便我可以將它放在子程序旁邊。

+0

謝謝smls!我更新了Rakudo,錯誤消失了。而且我也會研究Lock類。非常感謝你 !! – lisprogtor