Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Perl:特殊变量是线程安全的吗?_Multithreading_Perl_Concurrency_Sharing_Non Deterministic - Fatal编程技术网

Multithreading Perl:特殊变量是线程安全的吗?

Multithreading Perl:特殊变量是线程安全的吗?,multithreading,perl,concurrency,sharing,non-deterministic,Multithreading,Perl,Concurrency,Sharing,Non Deterministic,我读了一些关于$@全局变量的问题,以及如何在它被处理之前将其清除,因为成功的评估将其清除 但如果它被并发线程中发生的错误搞砸了怎么办?新的threads软件包表示,默认情况下不会共享stuff,这意味着它是为数不多的使“$a=$a;”成为主流语言的语言之一默认情况下是确定性的(想想人们说C#和Java在大型项目中比Perl好)。但我不确定特殊的全局变量 我的直觉告诉我,它们和其他变量一样,因此不会被共享。我的大脑本能地说‘让我们和巫师们一起检查一下Stackoverflow’ 我查看了Perld

我读了一些关于$@全局变量的问题,以及如何在它被处理之前将其清除,因为成功的评估将其清除

但如果它被并发线程中发生的错误搞砸了怎么办?新的threads软件包表示,默认情况下不会共享stuff,这意味着它是为数不多的使“$a=$a;”成为主流语言的语言之一默认情况下是确定性的(想想人们说C#和Java在大型项目中比Perl好)。但我不确定特殊的全局变量

我的直觉告诉我,它们和其他变量一样,因此不会被共享。我的大脑本能地说‘让我们和巫师们一起检查一下Stackoverflow’

我查看了Perldoc上的线程教程,它在共享部分介绍了普通变量,但似乎没有介绍特殊变量


我可以使用特殊变量而不冒被其他线程攻击的风险吗,即使我没有首先对它们进行本地化?例如,我可以从$@中提取一个值而不用担心并行线程中出现错误吗?

你的直觉是对的,它们不是共享的

好极了,好极了。在与Java线程进行了几次长会话之后,我开始玩弄线程模块。相比之下,这是一种幸福,但毫无疑问,线程局部变量会带来性能损失。在编写模块时,即使我自己不打算以线程安全的方式使用它们,我是否应该在外部资源周围设置锁,以使它们具有线程安全性?@Louis:使用线程局部变量不会受到惩罚。Perl线程的性能问题是,创建它们可能非常昂贵。关于锁定外部资源,您不需要锁定任何东西,除非您进入XS区域。@Louis:在线程之间移动数据时,您也可能会遇到性能问题。例如,如果使用
Thread::Queue
传递数据,并且每个线程都在计算一个大数组,那么将数据序列化为字符串(例如使用Storable)通常会更快,而不是让队列递归地将数据结构的每个成员转换为
threads::shared
变量。但是正如salva提到的,一旦创建了线程,线程私有变量就会全速运行。只有创建线程和使用共享变量才会减慢速度。@salva:是的,我指的是创建带有全新本地数据副本的新线程,这似乎对分叉新进程很熟悉。当我谈论外部资源时,我想应该举一个例子。如果由于糟糕的设计,我有一个使用硬编码文件读取/写入持久数据的包,那么我是否应该同步访问以使其线程安全,即使我现在不打算从多个线程使用它?在现代Perl软件包中这样做只是出于礼貌吗?@Louis=>在处理Perl线程时,或多或少可以使用适用于IPC的效率规则。当然,这是因为Perl的线程是有效的进程,这就是它们如何跨多个处理器并发运行,而不像其他一些语言的“绿色”线程。所以,总是喜欢一些大消息而不是许多小消息。