计算每秒添加到队列中添加的请求数 - 始终返回为零

Calculate number of requests added to queue per a second - always comes back as zero

本文关键字:添加 返回 队列 计算 请求      更新时间:2023-10-16

我正在研究一个通过API接收请求并将其添加到FIFO的项目。我希望能够记录收到的请求数(在队列中添加)和处理的请求数(从队列中删除)。目前,我试图收到第二个平均值。

我是通过拥有一个包含60个元素的longs来做到这一点,每个元素将存储该第二个收到的请求数。

我正在使用以下内容进行此操作:

if (fifo->enqueue(crashInfo))
    {
        this->requestProcessMutex.lock();
        this->currentRequestsASecond++; //Used to get the total requests a second
        this->requestProcessMutex.unlock();
        cout << "Current Requests Incremented to " << this->currentRequestsASecond << endl;
        return true;
    }
    else
    {
        return false;
    }

从上面的代码中,代码表明计数器正在递增,然后按预期重置为0。

要将请求添加到我进行的数组中,我还每10秒记录了当前平均值。

void FIFOManager::processRequestsSecondArray()
{
    int counter = 0;
    time_t lastLoggedTime = std::time(NULL);
    while (this->bitsLibrary->getApplicationStatus() != StatusManager::ApplicationStatus::Stopping)
    {
        this->requestProcessMutex.lock();
        time_t current_time = std::time(NULL);
        long timeDiff = current_time - lastLoggedTime;
        if (timeDiff >= 10) //Only log every 10 seconds
        {
            stringstream logstream;
            logstream << this->getAverageRequestProcessTime(AverageRetrievalType::RequestsASec) << " requests received a second";
            this->bitsLibrary->writeToLog(logstream.str(), "FIFOManager", "processRequestsSecondArray");
            lastLoggedTime = std::time(NULL);
        }
        requestsASecondForAMinute[counter] = this->currentRequestsASecond;
        cout << "ADDING REQUEST COUNTER VALUE " << this->currentRequestsASecond << " AT " << counter << endl;
        if (counter < 59)
        {
            counter++;
        }
        else
        {
            counter = 0; //Only storing a minutes worth (60 secondS) so reset and start to overwrite
        }
        this->requestProcessMutex.unlock();
        this_thread::sleep_for(chrono::seconds(1));
        this->requestProcessMutex.lock();
        this->currentRequestsASecond = 0;
        this->requestProcessMutex.unlock();
    }
}

processRequestsSecondArray在数组中,每秒钟都睡1秒钟,每秒应将currentRequestsASecond的值存储在当前第二个元素中,每分钟将其包装并通过数组覆盖。

ADDING REQUEST COUNTER VALUE的输出始终指出它正在添加0,但是currentRequestsASecond直到睡眠发生后才重置为0,所以我做错了什么?

您的 processRequestsSecondArray()函数看起来像一秒钟这样做:

  1. sleep_for()调用。

  2. currentRequestsASecond设置为零。

  3. 返回到while循环的顶部。

  4. 可能会计算并从数组中打印出平均值。

  5. currentRequestsASecond存储在requestsASecondForAMinute的元素中。

  6. 再次致电sleep_for()

看到问题了吗?

sleep_for()期间对currentRequestsASecond进行的任何更改都会被擦除,并且永远不会放入数组中。只有当增量很幸运地碰巧得到请求并在很短的时间内抓住utex时,您才能在那里获得一个值, processRequestsSecondArray()可以解锁互惠件,检查getApplicationStatus(),然后立即锁定互惠符。看来您需要重新排列一些逻辑。