作者:横着走觉察生活_915 | 来源:互联网 | 2022-11-30 01:55
根据perldoc threads
:
从Perl 5.8开始,线程编程已经可以使用称为解释器线程的模型,它为每个线程提供了一个新的Perl解释器,默认情况下,不会导致线程之间共享数据或状态信息.
上述报价中提到了哪些类型data
或state
信息?根据perldoc perlxs
:
从Perl 5.8开始,已经定义了一个宏框架,允许将静态数据安全地存储在可以从多线程Perl访问的XS模块中.
所以在我看来静态变量是在线程之间共享的?但Perl变量不共享?(我试图弄清楚哪种数据是线程安全的,以及如何创建线程安全模块)
1> ikegami..:
每个线程都有自己的解释器.这个struct [1]存储了所有组成的东西perl
,包括解析器状态,正则表达式引擎状态,符号表和所有" SV
"(包括标量,数组,散列,代码等).从Perl副本中创建新线程会生成当前解释器的副本.
XS代码可以安全地使用Perl API,因为每个函数都有一个参数,指定要使用的解释器.感谢宏,这通常对代码是不可见的,但您可能已经注意到对" THX
"或"Perl上下文"的引用.只是不要将属于一个解释器的SV传递给另一个解释器.(您可能听说过可能由此产生的"Free to wrong pool"错误消息.)
但Perl无法为其知识或控制之外的事物提供任何保护,例如它加载的外部库的静态存储.没有这些的副本.两个线程可以同时调用相同的C函数,因此需要采取预防措施,就像编写多线程C程序一样.
您的引用所暗示的宏框架可以访问每个解释器存储.它还允许库指定一个函数来调用创建新的Perl线程,以将变量克隆到新的解释器中.
如果Perl是在没有的情况下构建的-Dusemultiplicity
,那么Perl解释器就会包含一些bajillion全局(静态)变量.MULTIPLICITY
将它们移动到结构中并向Perl API调用添加上下文参数.这会降低性能,但它允许程序拥有多个Perl解释器.因为Perl的线程构建需要这个,所以构建一个线程perl
(-Dusethreads
)假设-Dusemultiplicity
.