gpt4 book ai didi

perl - 如何在 Perl 中的调用之间存储每个线程的状态?

转载 作者:行者123 更新时间:2023-12-03 12:57:44 25 4
gpt4 key购买 nike

现在根据我在 Perl ithreads 下的理解,除非明确共享,否则所有数据都是私有(private)的。

我想编写一个函数来存储调用之间的每个线程状态。我假设默认情况下所有数据都是线程私有(private)的副作用将允许我使用这样的闭包:

#!/usr/bin/perl -w

use strict;
use threads;

{ # closure to create local static variable
my $per_thread_state = 0;

sub foo {
my $inc = shift;
$per_thread_state += $inc;

return $per_thread_state;
}
}

my $inc = 0;

threads->create(
sub {
my $inc = shift;
my $i = $inc;
while (--$i) {
threads->yield();
print threads->tid().":".foo($inc)."\n";
}
}, $inc
) while (++$inc < $ARGV[0]);

$_->join() foreach threads->list();

当我运行它时,它看起来像我期望的那样工作,但我只是想确定一下,因为我找不到任何明确讨论这样做的文档。

谁能给我指点官方的东西?

编辑

另一件看起来很奇怪的事情是线程似乎总是按创建顺序运行,并且由于某种原因不会交错。例如,如果我运行:
./tsd.pl 100

一切都按顺序完美打印出来。如果重要的话,我在 Ubuntu 9.04 上。

最佳答案

如果您正在运行 Perl 5.9.4+,这似乎是使用 state 的不错选择。关键词。如果 state已启用,只有您的 foo()子程序将能够修改 $per_thread_state 的值.

就是这样:

use feature 'state';

sub foo {
state $per_thread_state;
my $inc = shift;
$per_thread_state += $inc;
return $per_thread_state;
}

记得启用 state虽然(来自 perlsub):

Beginning with perl 5.9.4, you can declare variables with the state keyword in place of my. For that to work, though, you must have enabled that feature beforehand, either by using the feature pragma, or by using -E on one-liners.



perlsub 也有一个关于 Persistent Private Variable with Closures 的部分.你所做的似乎很好。

关于perl - 如何在 Perl 中的调用之间存储每个线程的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2317114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com