multithreading - 在线程内创建共享变量可以吗?

标签 multithreading perl

我认为这可能是一个相当简单的问题。

我发现了很多使用线程和共享变量的示例,但没有一个示例在线程内部创建共享变量。我想确保我不会做一些似乎可行的事情,并且将来会花一些时间。

我需要这个的原因是我有一个将键映射到数组引用的共享哈希。这些引用由一个线程创建/填充,并由另一个线程读取/修改(假定同步正确)。为了存储这些数组引用,我也必须使其共享。否则我得到错误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/

相关文章:

perl - 如何在不使用 CPAN.pm 的情况下安装 Perl 模块?

windows - 为什么我的 ActivePerl 程序报告 'Sorry. Ran out of threads' ?

regex - 序列 (? 正则表达式不完整 - 负面环视

java - 是否可以在Java中等待特定锁的线程上调用notifyAll()?

c++ - 在类函数中将参数传递给 _beginthread

perl - 为什么 perl 的本地时间似乎输出错误的月份?

html - Perl 模块 HTML::Template 可以使用 <TMPL_VAR NAME=...> 之外的其他语法吗?

Perl 5.14 神秘的拼写错误错误消息、DESTROY 和 AUTOLOAD

c# - BlockingCollection 在 10 秒内不会重试

c++ - 使用 win32 线程进行矩阵乘法