1

我正在制作一个必须响应应用程序请求的 dll。应用程序的要求之一是调用不应花费很长时间才能完成。

比如说,我有一个函数 foo(),它由主机应用程序调用:

int foo(arg){
    // some code i need to execute, say,
    LengthyRoutine();
    return 0;
}

可以说, foo 必须执行肯定需要很长时间的任务(或调用函数)。该应用程序允许我设置一个等待变量;如果 foo 返回时此变量非零,它会一次又一次地调用 foo(在每次调用之前重置等待变量),直到等待返回 0。

最好的方法是什么?

我去吗:

int foo(arg){

    if (inRoutine == TRUE) {
        wait = 1;
        return 0;
    } else {
        if (doRoutine == TRUE) {
             LengthyRoutine();
             return 0;
        }
    }

    return 0;
}

这并不能真正解决 LongyRoutine 需要很长时间才能完成的问题。我是否应该根据它是否完成任务来生成某种类型的线程来更新 inRoutine?

谢谢..

4

3 回答 3

7

产生另一个线程几乎是最好的方法,只需确保在设置表示您已完成的变量之前设置结果变量以避免竞争条件。如果经常调用它,您可能希望提前生成一个工作线程并重用它以避免线程启动开销。

还有另一种可能的解决方案,每次调用函数时都做部分工作,但是这会在 DLL 中花费更多时间并且可能不是最佳的,而且对于大多数算法来说实现工作代码也更加复杂。

于 2009-03-18T06:29:50.813 回答
1

如果是 C 编程,请使用回调 - 将回调传递给 foo。您必须就回调签名达成一致,并在 LongyRoutine 中的工作完成时进行一些内务处理以触发它。

typedef (void) callbackFunction(void);

int foo(arg, callbackFunction)
{
   // some code i need to execute, say,
   // register callback and return right away
   // Trigger the LengthyRoutine to run after this function returns

   return 0;
}

LengthyRoutine()
{
   // do lenghty routine

   // now inform the caller with their suppiled callback
   callbackFunction();
}

本质上是 C 中的观察者模式。在我看来,C++ 使工作变得更容易/更干净

于 2009-03-18T19:45:43.087 回答
0

如果难以置信的罕见情况LengthyRoutine()不是 3rd 方代码并且您拥有所有源代码并且可以将其拆分,那么您可以考虑使用coroutines

于 2009-03-18T07:23:04.213 回答