使用线程计算共享值



我的脚本中有线程作为单独的进程运行。当我试图获得搜索线程的计数时,我只在第一个线程中找到(我在哪里打印它)。

这是我写的一个小脚本来显示确切的情况。

#!/usr/bin/perl
use threads;
use threads::shared;
my $found :shared = 0;
my $searched :shared = 0;
my $thr1 = threads->new(&THREAD1);
my $thr2 = threads->new(&THREAD2);
my @ReturnData = $thr1->join ;
my @ReturnData = $thr2->join ;
sub THREAD1 {
  for (1..400) {
    ++$found;
    print "$found / $searchedn";
  }
}
sub THREAD2 {
  for (1..1000) {
    ++$searched;
  }
}

我得到的输出是:

1 / 0
2 / 0
3 / 0
4 / 0
5 / 0
6 / 0
7 / 0
8 / 0
9 / 0
10 / 0
11 / 0
12 / 0
13 / 0
14 / 0
15 / 0
16 / 0
17 / 0
18 / 0
19 / 0
20 / 0
21 / 0
22 / 0
23 / 0
24 / 0
25 / 0
26 / 0
27 / 0
28 / 0
29 / 0
30 / 0
31 / 0
32 / 0
33 / 0
34 / 0
35 / 0
36 / 0
37 / 0
38 / 0
39 / 0
40 / 0
41 / 0
42 / 0
43 / 0
44 / 0
45 / 0
46 / 0
47 / 0
48 / 0
49 / 0
50 / 0
51 / 0
52 / 0
53 / 0
54 / 0
55 / 0
56 / 0
57 / 0
58 / 0
59 / 0
60 / 0
61 / 0
62 / 0
63 / 0
64 / 0
65 / 0
66 / 0
67 / 0
68 / 0
69 / 0
70 / 0
71 / 0
72 / 0
73 / 0

第一列应该是found,第二列应该是searched,但是,我得到这个奇怪的输出

我看到print语句只在THREAD1中。所以,看起来这两个线程是连续运行的,而不是缠绕在一起的。当你在THREAD2加入后添加一条print语句时,你应该看到$ searches也增加了。

for循环在线程中的执行速度非常快。所以THREAD1甚至在THREAD2启动之前就完成了。我在循环中添加了sleep语句,然后我看到了预期的交错执行。

您的输出没有什么奇怪的。你的第二个线程还没有开始"yet"

用简化的代码创建测试应用程序的一个问题是它可能太简单了。一个线程可以在另一个线程有机会启动之前完成,这可能会使您认为它没有运行。当我运行脚本时,我得到以下输出:

...
29 / 0
30 / 0
31 / 689
32 / 960
33 / 1000
34 / 1000
...

Thread2能够很快完成,因为它没有做任何重要的事情,但它们都运行。

为了得到更平衡的输出,我改变了第二个线程,使它也在做IO,但为了保证你可以观察到交织的输出,在两个线程中都加入一些sleep语句来减慢它们的速度。

sub THREAD2 {
  for (1..1000) {
    ++$searched;
    print "$found / $searchedn";
  }
}

最新更新