代码之家  ›  专栏  ›  技术社区  ›  Håkon Hægland

为什么xsub中的静态变量不是线程安全的?

  •  1
  • Håkon Hægland  · 技术社区  · 7 年前

    perldoc threads :

    从Perl5.8开始,线程编程就可以使用一个模型 默认情况下,每个线程都不会产生数据或状态信息

    什么类型的 data state perldoc perlxs :

    从Perl5.8开始,定义了一个宏框架,允许 静态数据安全地存储在将要访问的XS模块中

    (我试图弄清楚什么样的数据是线程安全的,以及如何创建线程安全模块)

    1 回复  |  直到 7 年前
        1
  •  6
  •   ikegami Gilles Quénot    6 年前

    每个线程都有自己的解释器。此结构 存储构成的所有内容 perl ,包括解析器状态、regex引擎状态、符号表和all“ SV “(其中包括标量、数组、哈希、代码等)。从Perl副本中创建一个新的线程将生成当前解释器的副本。

    XS代码可以安全地使用perlapi,因为每个函数都有一个指定要使用的解释器的参数。由于宏的存在,代码通常看不到这一点,但您可能已经注意到 THX 或“Perl上下文”。只是不要把属于一个口译员的SV传递给另一个口译员(您可能听说过可能由此产生的“Free to wrong pool”错误消息。)

    但是Perl不能对其知识或控制之外的事物提供任何保护,比如它加载的外部库的静态存储。没有复印件。两个线程可以同时调用同一个C函数,因此需要像编写多线程C程序一样采取预防措施。

    您引用的宏框架提供了对每个解释器存储的访问。它还允许库指定在创建新的Perl线程时调用的函数,以便将变量克隆到新的解释器中。


    1. 如果Perl构建时没有 -Dusemultiplicity ,Perl解释器由一个bajillion全局(静态)变量代替。 MULTIPLICITY perl语言 ( -Dusethreads )假定 -多重性 .