gpt4 book ai didi

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

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

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

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

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

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