【问题标题】:Counting shared values using threads使用线程计算共享值
【发布时间】:2014-07-14 21:12:28
【问题描述】:

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

这是我制作的一个小脚本,用于显示确切的情况。

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

【问题讨论】:

    标签: multithreading perl


    【解决方案1】:

    我看到打印语句只在 THREAD1 中。所以,看起来这两个线程是连续运行的,而不是交织在一起的。在加入 THREAD2 后添加打印语句时,您应该看到 $searched 也增加了。

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

    【讨论】:

      【解决方案2】:

      你的输出没有什么奇怪的。您的第二个主题还没有开始“还”

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

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

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

      为了获得更平衡的输出,我更改了第二个线程,使其也进行 IO,但为了保证您可以观察到相互交织的输出,请在两者中加入一些 sleep 语句以减慢它们的速度。:

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

      【讨论】:

      • 是的,我仍在寻找一个好的答复,它一次运行 2 个进程。一个监听与 pcap 的连接,直到线程 2(在主机上打开套接字)完成。
      • @ikegami OP 只发布了 400 行输出中的前 73 行。我没有发现他观察到的任何“奇怪”。虽然我不是线程专家,所以请随时加入更详细的解释。和一般意义上的一样,我看不出有什么问题。
      • @ikegami 不,我没有看到他的输出有什么奇怪的地方,因为他的线程根本还没有开始“还”。我试图改写我的回答以澄清我想说的话。
      猜你喜欢
      • 2017-09-24
      • 2017-12-30
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多