gpt4 book ai didi

multithreading - Perl中的线程同步/调度

转载 作者:行者123 更新时间:2023-12-03 13:18:05 25 4
gpt4 key购买 nike

我有一个带有一些功能的perl对象。每个功能从主程序中调用一次。我想并行运行某些功能以节省时间。由于某些功能取决于先前功能的结果,因此我无法将它们全部一起运行。

我想到了这样的事情:

  • 对于每个函数,保留一个标志,该标志初始化为false,并在结束时由该函数设置为true(例如func1中的最后一行将是$is_func1_done = 1)。
  • 通过循环开始每个函数,该循环等待,直到它依赖的函数的所有标志都为真为止。例如:如果func1取决于func2func3,则:
     sub func1 {
    while (!($is_func2_done && $is_func3_done)) {
    # do nothing
    }
    # do work
    }

  • 然后,我可以立即为每个函数启动一个线程,但是每个函数的实际工作只有在准备好后才开始。这有意义吗?我在旗标上需要锁吗?使用这种 while循环是否常见? -想到繁忙等待一词...也许我的大部分CPU时间都将花费在这些 while上?有没有更标准的解决方案?

    最佳答案

    Does this make sense?



    是的-每个任务都知道其先决条件,并在执行前等待它们被满足。它是许多有效设计之一,尽管您可能会发现随着任务数量的增加以及它们之间的相互依赖性变得越来越复杂,很难进行扩展。

    Do I need any locks here on the flags?



    是的。这些标志必须为 shared,以便一个线程可以操作它们,而另一个线程可以看到它们,并且共享变量需要经过 lock()编码才能安全使用。

    Is using such while loops common? -- the term busy waiting comes to mind



    可悲的是,但是请不要那样做。 perl中的共享变量可以用作条件变量,线程可以通过这些条件变量相互发送通知:
    sub func1 {
    {
    lock(%shared_state);
    until ($shared_state{ "func2 done" } and $shared_state{ "func3 done" }) {
    cond_wait(%shared_state);
    }
    }
    # do work -- note that %shared_state is unlocked

    # now tell others that we're done
    lock(%shared_state);
    $shared_state{ "func1 done" } = 1;
    cond_broadcast(%shared_state);
    # %shared_state will be unlocked, and broadcast delivered when we leave this scope
    }

    当您 cond_wait时,共享变量将被解锁,您的线程将进入休眠状态。无需忙循环。

    Is there a more standard solution to this?


    $thr->joinSinan suggests一样,是一种等待特定线程完成运行的简单自然的方法。 Thread::Semaphore可以提供类似但更复杂的功能(并且可以将其初始化为小于零的值)。可以通过 Thread::Barrier来实现“等待这5个线程完成操作”的常见需求。 TMTOWTDI。

    关于multithreading - Perl中的线程同步/调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470184/

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