【问题标题】:How do I conditionally use threads in a perl script?如何在 perl 脚本中有条件地使用线程?
【发布时间】:2013-07-03 17:16:59
【问题描述】:

我开发了一个 perl 脚本,它运行在具有不同 perl 版本的主机上,有时使用线程编译,有时不编译。

我有一个

use if $Config{"useithreads"}, "threads";

而且我所有的线程特定代码都在类似的条件下。

但是,在编译阶段,perl 仍然会在 threads::all、threads::running 等上阻塞。

我如何不确定我的脚本是否在线程和非线程 perls 上运行?

 [ worr on worr-mn1 ] ( manage_usr_local_admin ) % perl -c acct_mgr_ng.pl
Bareword "threads::joinable" not allowed while "strict subs" in use at acct_mgr_ng.pl line 117.
BEGIN not safe after errors--compilation aborted at acct_mgr_ng.pl line 541.

【问题讨论】:

  • 如果 $Config{useithreads},您希望在 BEGIN 块中要求线程,而不是使用它。
  • 展示“窒息”的样子

标签: multithreading perl


【解决方案1】:

当线程被加载时,perl 知道threads::all(和朋友)是一个子程序调用,即使没有括号或&;由于线程可能不会被加载,只需用括号显式调用它:threads::all()

【讨论】:

    【解决方案2】:

    use 语句在编译时被解析。您想在运行时使用requireModule::Load 有条件地拉入模块。

    这样的事情应该可以工作:

    use Module::Load ();
    if($Config{'useithreads'}) {
        Module::Load::load("threads");
    }
    

    【讨论】:

    • 我采纳了@ysth 的建议并使用了 if,但是在非线程机器上编译时在查找 threads::all、threads::running 等符号时仍然失败。
    • 失败如何?告诉我们会发生什么!向我们展示使用threads::all等的代码
    • 我更新了我的问题以反映@ysth 的更改并显示编译输出
    • @worr,我们需要查看产生错误的代码,而不仅仅是错误输出。更好:我们需要能够运行产生错误的演示代码。
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多