我认为这可能是一个相当简单的问题。
我发现了很多使用线程和共享变量的示例,但没有一个示例在线程内部创建共享变量。我想确保我不会做一些似乎可行的事情,并且将来会花一些时间。
我需要这个的原因是我有一个将键映射到数组引用的共享哈希。这些引用由一个线程创建/填充,并由另一个线程读取/修改(假定同步正确)。为了存储这些数组引用,我也必须使其共享。否则我得到错误Invalid value for shared scalar
。
以下是一个示例:
my %hash :shared;
my $t1 = threads->create(
sub { my @ar :shared = (1,2,3); $hash{foo} = \@ar });
$t1->join;
my $t2 = threads->create(
sub { print Dumper(\%hash) });
$t2->join;
这可以按预期工作:第二个线程看到第一个所做的更改。但这真的在所有情况下都适用吗?
一些澄清(关于伊恩的答案):
我有一个线程A从管道读取并等待输入。如果有的话,线程A将把此输入写入共享哈希(它将标量映射到哈希...这些哈希也需要声明为共享),并继续在管道上监听。当有事情要做时(通过
cond_wait
/cond_signal
)通知另一个线程B,对共享哈希中的内容进行处理,并在完成后删除适当的条目。同时,A可以将新的东西添加到哈希中。所以关于伊恩的问题
[...] Hence most people create all their shared variables before starting any sub-threads.
Therefore even if shared variables can be created in a thread, how useful would it be?
共享哈希是一个动态增长和收缩的数据结构,它表示尚未进行的计划工作。因此,在程序开始时创建完整的数据结构是没有意义的。
程序也必须位于(至少)两个线程中,因为当然要从管道块中读取数据。此外,如果没有共享变量,我看不出有什么办法可以做到这一点。
最佳答案
共享变量的原因是共享。因此,您可能希望有多个线程访问该变量。
如果在子线程中创建共享变量,如何在创建共享变量之前停止其他线程对其进行访问?因此,大多数人在启动任何子线程之前创建所有共享变量。
因此,即使可以在线程中创建共享变量,它还有多大用处?
(PS,我不知道perl中是否有任何东西可以阻止在线程中创建共享变量。)
PS一个好的设计将导致很少(如果有)共享变量
关于multithreading - 在线程内创建共享变量可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3820242/