c++ - 如何避免阻塞(C++、Win32)

标签 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;
}

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

谢谢..

最佳答案

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

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

关于c++ - 如何避免阻塞(C++、Win32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/657141/

相关文章:

c++ - 为什么这个循环变量可以在循环范围外访问?

c++ - 如何在 C++ 中计算文件的 sha1sum?

java - 并发 int 读写问题

java - Servlets 线程访问控制

c++ - 用 C++ 风格的注释替换 C 风格的注释

c++ - 在字符串中移动一个单词,单词之间用空格作为分隔符

java - Spring Controller 是线程安全的吗?

java - 阻塞 DBCP 连接池(打开和关闭连接)。 OpenEJB 中的数据库连接池是可插拔的吗?

TCP 客户端服务器 : blocking connect call

node.js - Node 中读取流的新方式会导致阻塞吗?