使并行代码工作的某些部分与主代码

使并行代码工作的某些部分与主代码

问题描述:

如何创建将在while循环不平行任何终止运行到我的主代码的函数使并行代码工作的某些部分与主代码

sub somefunction{ 
while(1){ 
    print $a+$b; 
} 
} 

my $a=1; 
my $b=2; 

somefunction(); #make it work without termination 

#Main Body 
while (1) { 
    $c = <STDIN>; 
    print $a+$b+$c; 
} 

这只是
的一个实例就是我想要做的,somefunction()应该总是打印$a+$b,我读过。我读过perl threads,但使用threads->create('somefunction', '');没有给我任何期待的结果...

+0

它不会,因为'$ a'和'$ b'不在范围内,所以是空的。它一遍又一遍地打印空字符串。 – Sobrique 2014-10-06 16:41:31

这是一个复杂的问题比你想象的更多一点。线程将做到这一点,但通过任何并行处理,你会得到一些有趣的潜在问题。

线程是并行运行的子例程。但是,它在启动时会继承程序的内存状态,并使用它。

在您列出的示例中,$a$b不在您的子范围内,因此它不会执行任何操作。 (注意 - 这些都是不好的变量,因为sort使用它们 - 因此,如果您滥用它们,它们将不会响铃于strictwarnings之间)。

像这样的事情会“工作”:

#!/usr/bin/perl 
use strict; 
use warnings; 
use threads; 

my $param_1 = 1; 
my $param_2 = 2; 

sub parallel_part { 
    while (1) { 
     print $param_1 + $param_2, "\n"; 
     sleep 1; 
    } 
} 


#Main Body 

#start our thread... 
my $thr = threads -> create (\&parallel_part); 


while (1) { 
    my $input_value = <STDIN>; 
    print $param_1 + $param_2 + $input_value,"\n"; 
} 

#wait for our thread to exit 
#will never happen, because we've got two 'while true' loops. 
$thr -> join(); 

这是一个有点人为案件虽然 - 真正的问题是“什么是你想实现什么?”。这只会反复打印'3',因为你永远不会改变参数。 (如果您想从线索外部执行此操作,则需要使用threads::shared)。

+1

请注意,每个线程都有自己的'$ param_1'。改变一个不会改变另一个。 – ikegami 2014-10-06 18:04:11