如何避免阻塞(C ++,Win32)

时间:2009-03-18 06:14:47

标签: c++ multithreading blocking

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

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

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

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

最好的方法是什么?

我去吧:

int foo(arg){

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

    return 0;
}

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

谢谢..

3 个答案:

答案 0 :(得分:7)

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

还有另一种可能的解决方案,每次调用函数时都要完成部分工作,但这会花费更多的时间在DLL中并且可能不是最优的,并且为大多数算法实现工作代码更复杂

答案 1 :(得分: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();
}

基本上Observer C. C ++中的模式使我的工作变得更容易/更清洁

答案 2 :(得分:0)

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