perl6线程读取干扰

perl6 Thread reading interference

我需要有多个线程,每个线程都从同一个套接字或 $*输入;但是,似乎有错误,因为每个人都试图从同一来源读取(我认为)。解决此问题的最佳方法是什么?谢谢!!

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

谢谢!!

在 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 outside 的原因。我没有在程序的顶部执行它,而是使用 BEGIN phaser 以便我可以将它放在子例程旁边。