使用线程计算共享值

时间:2014-05-26 06:50:10

标签: multithreading perl

我在我的脚本中将线程作为单独的进程运行。 当我试图获取搜索线程的数量时,我只能在第一个线程中找到它(无论如何我在哪里打印)。

这是一个用来提出确切情况的小脚本。

#!/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 / $searched\n";
  }
}

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,但是,我得到了这个奇怪的输出。

2 个答案:

答案 0 :(得分:1)

我看到print语句只在THREAD1中。因此,看起来两个线程连续运行而不是交织在一起。当您在加入THREAD2后添加打印语句时,您应该看到$ searching也会增加。

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

答案 1 :(得分:1)

你的输出并不奇怪。你的第二个帖子还没有开始“尚未”

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

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

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

为了获得更平衡的输出,我更改了第二个线程以便它也在执行IO,但是为了保证您可以观察交织的输出,在两者中引入一些sleep语句以减慢它们。:< / p>

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