极限功能调用

时间:2018-08-07 04:16:10

标签: c++ function

限制c ++中的函数调用的最佳方法是什么?

我有一个从Web服务器到某个功能的异步请求。问题是,如果请求率很高(该函数在其他函数完成之前将被多次调用),则程序将崩溃。我想将其限制为一定数量,方法是先将请求存储在队列中,然后队列将管理对该函数的调用。

我已经创建了两个类,RQServer和RQClient。

rqueue.h

class RQServer {
    public:
        RQServer();
        std::queue<Request> *getQueue();
    private:
        std::queue<Request> _requests;
};

class RQClient {
    public:
        RQClient();
        bool connect(RQServer server);
        bool push(Request req);
    private:
        std::queue<Requst> *_requests;
};

rqueue.cpp

#include "rqueue.h"

RQServer::RQServer(){}

std::queue<Request> *RQServer::getQueue(){
    return &_requests;
}

RQClient::RQClient(){}

RQClient::connect(RQServer server){
    _requests = server.getQueue();
}

RQClient::push(Request req){
    _requests -> push(req);
}

一种明显的方法是创建方法RQServer::run(),该方法根据对函数的允许的异步调用(例如,我设置了limit变量)来创建线程,并且每个线程将始终检查队列。问题是limit是数百个时。

1 个答案:

答案 0 :(得分:0)

缺少MCVe时,请说您是这样开始的。

  1. 您有一组有限的工作线程。
  2. 每个线程一旦完成了当前请求,就会使新请求出队并开始对其进行处理。
  3. 前面有一个队列,可以简化请求。应当限制它,并在达到限制后丢弃请求。这意味着您的后端已被100%占用,无法处理传入的请求。
  4. 您的前端(用户可见)服务器应该收到一个请求,并使其排队或在达到限制时丢弃。

绝对不要创建新线程来服务新请求。拥有队列的全部目的是将工作线程与接收方断开,并吸收所有瞬态。